Skip to content

Commit 3124d97

Browse files
authored
codec: fix "prefix of array attribute must be an object name" (#635)
1 parent f1c4102 commit 3124d97

4 files changed

Lines changed: 120 additions & 77 deletions

File tree

vunit/com/codec_vhdl_array_type.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ class ArrayCodecTemplate(DatatypeCodecTemplate):
172172
function encode (
173173
constant data : $type)
174174
return string is
175-
constant length : positive := encode(data(data'left))'length;
175+
constant length : positive := get_encoded_length(encode(data(data'left)));
176176
variable index : positive := 1;
177177
variable ret_val : string(1 to data'length * length);
178178
begin
@@ -233,7 +233,7 @@ class ArrayCodecTemplate(DatatypeCodecTemplate):
233233
function encode (
234234
constant data : $type)
235235
return string is
236-
constant length : positive := encode(data(data'left(1), data'left(2)))'length;
236+
constant length : positive := get_encoded_length(encode(data(data'left(1), data'left(2))));
237237
variable index : positive := 1;
238238
variable ret_val : string(1 to data'length(1) * data'length(2) * length);
239239
begin
@@ -305,11 +305,11 @@ class ArrayCodecTemplate(DatatypeCodecTemplate):
305305
if data'length = 0 then
306306
return 0;
307307
else
308-
return encode(data(data'left))'length;
308+
return get_encoded_length(encode(data(data'left)));
309309
end if;
310310
end;
311311
constant length : natural := element_length(data);
312-
constant range_length : positive := encode(data'left)'length;
312+
constant range_length : positive := get_encoded_length(encode(data'left));
313313
variable index : positive := 2 + 2 * range_length;
314314
variable ret_val : string(1 to 1 + 2 * range_length + data'length * length);
315315
begin
@@ -328,7 +328,7 @@ class ArrayCodecTemplate(DatatypeCodecTemplate):
328328
constant code : string;
329329
variable index : inout positive;
330330
variable result : out $array_type) is
331-
constant range_length : positive := encode($range_type'left)'length;
331+
constant range_length : positive := get_encoded_length(encode($range_type'left));
332332
begin
333333
index := index + 1 + 2 * range_length;
334334
for i in result'range loop
@@ -339,7 +339,7 @@ class ArrayCodecTemplate(DatatypeCodecTemplate):
339339
function decode (
340340
constant code : string)
341341
return $array_type is
342-
constant range_length : positive := encode($range_type'left)'length;
342+
constant range_length : positive := get_encoded_length(encode($range_type'left));
343343
function ret_val_range (
344344
constant code : string)
345345
return $array_type is
@@ -401,12 +401,12 @@ class ArrayCodecTemplate(DatatypeCodecTemplate):
401401
if data'length(1) * data'length(2) = 0 then
402402
return 0;
403403
else
404-
return encode(data(data'left(1), data'left(2)))'length;
404+
return get_encoded_length(encode(data(data'left(1), data'left(2))));
405405
end if;
406406
end;
407407
constant length : natural := element_length(data);
408-
constant range1_length : positive := encode(data'left(1))'length;
409-
constant range2_length : positive := encode(data'left(2))'length;
408+
constant range1_length : positive := get_encoded_length(encode(data'left(1)));
409+
constant range2_length : positive := get_encoded_length(encode(data'left(2)));
410410
variable index : positive := 3 + 2 * range1_length + 2 * range2_length;
411411
variable ret_val : string(1 to 2 + 2 * range1_length + 2 * range2_length +
412412
data'length(1) * data'length(2) * length);
@@ -428,8 +428,8 @@ class ArrayCodecTemplate(DatatypeCodecTemplate):
428428
constant code : string;
429429
variable index : inout positive;
430430
variable result : out $array_type) is
431-
constant range1_length : positive := encode($range_type1'left)'length;
432-
constant range2_length : positive := encode($range_type2'left)'length;
431+
constant range1_length : positive := get_encoded_length(encode($range_type1'left));
432+
constant range2_length : positive := get_encoded_length(encode($range_type2'left));
433433
begin
434434
index := index + 2 + 2 * range1_length + 2 * range2_length;
435435
for i in result'range(1) loop
@@ -442,8 +442,8 @@ class ArrayCodecTemplate(DatatypeCodecTemplate):
442442
function decode (
443443
constant code : string)
444444
return $array_type is
445-
constant range1_length : positive := encode($range_type1'left)'length;
446-
constant range2_length : positive := encode($range_type2'left)'length;
445+
constant range1_length : positive := get_encoded_length(encode($range_type1'left));
446+
constant range2_length : positive := get_encoded_length(encode($range_type2'left));
447447
function ret_val_range (
448448
constant code : string)
449449
return $array_type is

vunit/com/codec_vhdl_package.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,12 @@ def _generate_array_codec_and_to_string_functions(self):
128128
"""Generate codecs and to_string functions for all array data types."""
129129

130130
declarations = ""
131-
definitions = ""
131+
definitions = """
132+
-- Helper function to make tests pass GHDL v0.37
133+
function get_encoded_length ( constant vec: string ) return integer is
134+
begin return vec'length; end;
135+
136+
"""
132137
for array in self.array_types:
133138
(
134139
new_declarations,

vunit/vhdl/data_types/test/tb_codec-2008p.vhd

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,30 @@ begin
5353
variable real_vector_5_downto_3 : real_vector(5 downto 3);
5454
variable time_vector_5_downto_3 : time_vector(5 downto 3);
5555

56-
-- Temp variables to make test case pass Riviera-PRO 2016.10
57-
variable range_left, range_right : integer;
56+
-- Helper functions to make tests pass GHDL v0.37 and Riviera-PRO 2016.10
57+
function get_decoded_range_left ( constant vec: boolean_vector ) return integer is
58+
begin return vec'left; end;
59+
60+
function get_decoded_range_right ( constant vec: boolean_vector ) return integer is
61+
begin return vec'right; end;
62+
63+
function get_decoded_range_left ( constant vec: integer_vector ) return integer is
64+
begin return vec'left; end;
65+
66+
function get_decoded_range_right ( constant vec: integer_vector ) return integer is
67+
begin return vec'right; end;
68+
69+
function get_decoded_range_left ( constant vec: real_vector ) return integer is
70+
begin return vec'left; end;
71+
72+
function get_decoded_range_right ( constant vec: real_vector ) return integer is
73+
begin return vec'right; end;
74+
75+
function get_decoded_range_left ( constant vec: time_vector ) return integer is
76+
begin return vec'left; end;
77+
78+
function get_decoded_range_right ( constant vec: time_vector ) return integer is
79+
begin return vec'right; end;
5880

5981
begin
6082
test_runner_setup(runner, runner_cfg);
@@ -63,57 +85,49 @@ begin
6385
if run("Test that boolean_vector can be encoded and decoded") then
6486
boolean_vector_5_downto_3 := (true, false, true);
6587
check_relation(decode_boolean_vector(encode_boolean_vector((true, false, true))) = boolean_vector'(true, false, true));
66-
check_relation(decode_boolean_vector(encode_boolean_vector((0 => true))) = boolean_vector'(0 => true));
88+
check_relation(decode_boolean_vector(encode_boolean_vector((0 => true))) = boolean_vector'(0 => true));
6789
check_relation(decode_boolean_vector(encode_boolean_vector(null_boolean_vector)) = null_boolean_vector);
6890
check_relation(decode_boolean_vector(encode_boolean_vector(boolean_vector_5_downto_3)) = boolean_vector'(true, false, true));
69-
range_left := decode_boolean_vector(encode_boolean_vector(boolean_vector_5_downto_3))'left;
70-
range_right := decode_boolean_vector(encode_boolean_vector(boolean_vector_5_downto_3))'right;
71-
check_relation(range_left = 5);
72-
check_relation(range_right = 3);
91+
check_relation(get_decoded_range_left(decode_boolean_vector(encode_boolean_vector(boolean_vector_5_downto_3))) = 5);
92+
check_relation(get_decoded_range_right(decode_boolean_vector(encode_boolean_vector(boolean_vector_5_downto_3))) = 3);
7393
elsif run("Test that integer_vector can be encoded and decoded") then
7494
integer_vector_5_downto_3 := (-42, 0, 17);
7595
check_relation(decode_integer_vector(encode_integer_vector((-2147483648, -2147483648, -2147483648))) = integer_vector'(-2147483648, -2147483648, -2147483648));
7696
check_relation(decode_integer_vector(encode_integer_vector((-42, 0, 17))) = integer_vector'(-42, 0, 17));
77-
check_relation(decode_integer_vector(encode_integer_vector((0 => -42))) = integer_vector'(0 => -42));
97+
check_relation(decode_integer_vector(encode_integer_vector((0 => -42))) = integer_vector'(0 => -42));
7898
check_relation(decode_integer_vector(encode_integer_vector(null_integer_vector)) = null_integer_vector);
7999
check_relation(decode_integer_vector(encode_integer_vector(integer_vector_5_downto_3)) = integer_vector'(-42, 0, 17));
80-
range_left := decode_integer_vector(encode_integer_vector(integer_vector_5_downto_3))'left;
81-
range_right := decode_integer_vector(encode_integer_vector(integer_vector_5_downto_3))'right;
82-
check_relation(range_left = 5);
83-
check_relation(range_right = 3);
100+
check_relation(get_decoded_range_left(decode_integer_vector(encode_integer_vector(integer_vector_5_downto_3))) = 5);
101+
check_relation(get_decoded_range_right(decode_integer_vector(encode_integer_vector(integer_vector_5_downto_3))) = 3);
84102
elsif run("Test that real_vector can be encoded and decoded") then
85103
real_vector_5_downto_3 := (-42.42, 0.001, 17.17);
86104
check_relation(decode_real_vector(encode_real_vector((-42.42, 0.001, 17.17))) = real_vector'(-42.42, 0.001, 17.17));
87105
check_relation(decode_real_vector(encode_real_vector((0 => -42.42))) = real_vector'(0 => -42.42));
88106
check_relation(decode_real_vector(encode_real_vector(null_real_vector)) = null_real_vector);
89107
check_relation(decode_real_vector(encode_real_vector(real_vector_5_downto_3)) = real_vector'(-42.42, 0.001, 17.17));
90-
range_left := decode_real_vector(encode_real_vector(real_vector_5_downto_3))'left;
91-
range_right := decode_real_vector(encode_real_vector(real_vector_5_downto_3))'right;
92-
check_relation(range_left = 5);
93-
check_relation(range_right = 3);
108+
check_relation(get_decoded_range_left(decode_real_vector(encode_real_vector(real_vector_5_downto_3))) = 5);
109+
check_relation(get_decoded_range_right(decode_real_vector(encode_real_vector(real_vector_5_downto_3))) = 3);
94110
elsif run("Test that time_vector can be encoded and decoded") then
95111
time_vector_5_downto_3 := (-42 ms, 0 sec, 17 min);
96112
check_relation(decode_time_vector(encode_time_vector((-42 ms, 0 sec, 17 min))) = time_vector'(-42 ms, 0 sec, 17 min));
97-
check_relation(decode_time_vector(encode_time_vector((0 => -42 ms))) = time_vector'(0 => -42 ms));
113+
check_relation(decode_time_vector(encode_time_vector((0 => -42 ms))) = time_vector'(0 => -42 ms));
98114
check_relation(decode_time_vector(encode_time_vector(null_time_vector)) = null_time_vector);
99115
check_relation(decode_time_vector(encode_time_vector(time_vector_5_downto_3)) = time_vector'(-42 ms, 0 sec, 17 min));
100-
range_left := decode_time_vector(encode_time_vector(time_vector_5_downto_3))'left;
101-
range_right := decode_time_vector(encode_time_vector(time_vector_5_downto_3))'right;
102-
check_relation(range_left = 5);
103-
check_relation(range_right = 3);
116+
check_relation(get_decoded_range_left(decode_time_vector(encode_time_vector(time_vector_5_downto_3))) = 5);
117+
check_relation(get_decoded_range_right(decode_time_vector(encode_time_vector(time_vector_5_downto_3))) = 3);
104118
elsif run("Test that ufixed can be encoded and decoded") then
105-
check_relation(decode_ufixed(encode_ufixed(to_ufixed(6.5, 3, -3))) = to_ufixed(6.5, 3, -3));
106-
check_relation(decode_ufixed(encode_ufixed(to_ufixed(8.0, 3, 1))) = to_ufixed(8.0, 3, 1));
119+
check_relation(decode_ufixed(encode_ufixed(to_ufixed( 6.5, 3, -3))) = to_ufixed(6.5, 3, -3));
120+
check_relation(decode_ufixed(encode_ufixed(to_ufixed( 8.0, 3, 1))) = to_ufixed(8.0, 3, 1));
107121
check_relation(decode_ufixed(encode_ufixed(to_ufixed(0.25, -2, -4))) = to_ufixed(0.25, -2, -4));
108122
elsif run("Test that sfixed can be encoded and decoded") then
109-
check_relation(decode_sfixed(encode_sfixed(to_sfixed(6.5, 3, -3))) = to_sfixed(6.5, 3, -3));
110-
check_relation(decode_sfixed(encode_sfixed(to_sfixed(8.0, 4, 1))) = to_sfixed(8.0, 4, 1));
111-
check_relation(decode_sfixed(encode_sfixed(to_sfixed(0.25, -1, -4))) = to_sfixed(0.25, -1, -4));
112-
check_relation(decode_sfixed(encode_sfixed(to_sfixed(-6.5, 3, -3))) = to_sfixed(-6.5, 3, -3));
113-
check_relation(decode_sfixed(encode_sfixed(to_sfixed(-8.0, 4, 1))) = to_sfixed(-8.0, 4, 1));
123+
check_relation(decode_sfixed(encode_sfixed(to_sfixed( 6.5, 3, -3))) = to_sfixed(6.5, 3, -3));
124+
check_relation(decode_sfixed(encode_sfixed(to_sfixed( 8.0, 4, 1))) = to_sfixed(8.0, 4, 1));
125+
check_relation(decode_sfixed(encode_sfixed(to_sfixed(0.25, -1, -4))) = to_sfixed(0.25, -1, -4));
126+
check_relation(decode_sfixed(encode_sfixed(to_sfixed(-6.5, 3, -3))) = to_sfixed(-6.5, 3, -3));
127+
check_relation(decode_sfixed(encode_sfixed(to_sfixed(-8.0, 4, 1))) = to_sfixed(-8.0, 4, 1));
114128
check_relation(decode_sfixed(encode_sfixed(to_sfixed(-0.25, -1, -4))) = to_sfixed(-0.25, -1, -4));
115129
elsif run("Test that float can be encoded and decoded") then
116-
check_relation(decode_float(encode_float(to_float(real'low, 11, 52))) = to_float(real'low, 11, 52));
130+
check_relation(decode_float(encode_float(to_float(real'low, 11, 52))) = to_float(real'low, 11, 52));
117131
check_relation(decode_float(encode_float(to_float(real'high, 11, 52))) = to_float(real'high, 11, 52));
118132

119133
check_relation(to_string(decode_float(encode_float(positive_zero))) = to_string(positive_zero));

0 commit comments

Comments
 (0)