Skip to content

Commit 6436ae1

Browse files
committed
SystemVerilog: $typename should return byte, int, shortint, etc.
When given byte, int, shortint, int, longint, $typename needs to return that instead of the expansion.
1 parent 578d1af commit 6436ae1

File tree

5 files changed

+105
-20
lines changed

5 files changed

+105
-20
lines changed

regression/verilog/data-types/signed2.sv

+12-6
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,18 @@ module main;
55
assert final ($typename(bit unsigned[1:0]) == "bit[1:0]");
66
assert final ($typename(bit signed) == "bit signed[0:0]");
77
assert final ($typename(bit signed[1:0]) == "bit signed[1:0]");
8-
assert final ($typename(byte) == "bit signed[7:0]");
9-
assert final ($typename(byte unsigned) == "bit[7:0]");
10-
assert final ($typename(byte signed) == "bit signed[7:0]");
11-
assert final ($typename(int) == "bit signed[31:0]");
12-
assert final ($typename(int unsigned) == "bit[31:0]");
13-
assert final ($typename(int signed) == "bit signed[31:0]");
8+
assert final ($typename(byte) == "byte");
9+
assert final ($typename(byte unsigned) == "byte unsigned");
10+
assert final ($typename(byte signed) == "byte");
11+
assert final ($typename(int) == "int");
12+
assert final ($typename(int unsigned) == "int unsigned");
13+
assert final ($typename(int signed) == "int");
14+
assert final ($typename(shortint) == "shortint");
15+
assert final ($typename(shortint unsigned) == "shortint unsigned");
16+
assert final ($typename(shortint signed) == "shortint");
17+
assert final ($typename(longint) == "longint");
18+
assert final ($typename(longint unsigned) == "longint unsigned");
19+
assert final ($typename(longint signed) == "longint");
1420
assert final ($typename(integer) == "bit signed[31:0]");
1521
assert final ($typename(integer unsigned) == "bit[31:0]");
1622
assert final ($typename(integer signed) == "bit signed[31:0]");

regression/verilog/packages/package_typedef1.sv

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ module main;
88

99
moo::my_type some_var;
1010

11-
assert final ($typename(some_var) == "bit signed[7:0]");
11+
assert final ($typename(some_var) == "byte");
1212

1313
endmodule

src/verilog/verilog_elaborate_type.cpp

+24-10
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,15 @@ typet verilog_typecheck_exprt::elaborate_type(const typet &src)
219219
auto rec = elaborate_type(subtype);
220220

221221
if(rec.id() == ID_unsignedbv)
222-
return signedbv_typet{to_unsignedbv_type(rec).width()};
222+
{
223+
auto dest = signedbv_typet{to_unsignedbv_type(rec).width()};
224+
225+
auto verilog_type = rec.get(ID_C_verilog_type);
226+
if(verilog_type != irep_idt{})
227+
dest.set(ID_C_verilog_type, verilog_type);
228+
229+
return dest;
230+
}
223231
else if(rec.id() == ID_bool)
224232
return signedbv_typet{1};
225233
else
@@ -241,7 +249,15 @@ typet verilog_typecheck_exprt::elaborate_type(const typet &src)
241249
auto rec = elaborate_type(subtype);
242250

243251
if(rec.id() == ID_signedbv)
244-
return unsignedbv_typet{to_signedbv_type(rec).width()};
252+
{
253+
auto dest = unsignedbv_typet{to_signedbv_type(rec).width()};
254+
255+
auto verilog_type = rec.get(ID_C_verilog_type);
256+
if(verilog_type != irep_idt{})
257+
dest.set(ID_C_verilog_type, verilog_type);
258+
259+
return dest;
260+
}
245261
else
246262
return rec;
247263
}
@@ -255,23 +271,21 @@ typet verilog_typecheck_exprt::elaborate_type(const typet &src)
255271
}
256272
else if(src.id() == ID_verilog_byte)
257273
{
258-
// two-valued type, signed
259-
return signedbv_typet{8}.with_source_location(source_location);
274+
return verilog_byte_typet{}.lower().with_source_location(source_location);
260275
}
261276
else if(src.id() == ID_verilog_shortint)
262277
{
263-
// two-valued type, signed
264-
return signedbv_typet{16}.with_source_location(source_location);
278+
return verilog_shortint_typet{}.lower().with_source_location(
279+
source_location);
265280
}
266281
else if(src.id() == ID_verilog_int)
267282
{
268-
// two-valued type, signed
269-
return signedbv_typet{32}.with_source_location(source_location);
283+
return verilog_int_typet{}.lower().with_source_location(source_location);
270284
}
271285
else if(src.id() == ID_verilog_longint)
272286
{
273-
// two-valued type, signed
274-
return signedbv_typet{64}.with_source_location(source_location);
287+
return verilog_longint_typet{}.lower().with_source_location(
288+
source_location);
275289
}
276290
else if(src.id() == ID_verilog_integer)
277291
{

src/verilog/verilog_typecheck_expr.cpp

+22-2
Original file line numberDiff line numberDiff line change
@@ -727,19 +727,39 @@ exprt verilog_typecheck_exprt::typename_string(const exprt &expr)
727727
auto left = this->left(expr);
728728
auto right = this->right(expr);
729729

730+
const auto verilog_type = type.get(ID_C_verilog_type);
731+
730732
std::string s;
731733

732734
if(type.id() == ID_unsignedbv || type.id() == ID_verilog_unsignedbv)
733735
{
734-
s = "bit[" + to_string(left) + ":" + to_string(right) + "]";
736+
if(verilog_type == ID_verilog_byte)
737+
s = "byte unsigned";
738+
else if(verilog_type == ID_verilog_int)
739+
s = "int unsigned";
740+
else if(verilog_type == ID_verilog_longint)
741+
s = "longint unsigned";
742+
else if(verilog_type == ID_verilog_shortint)
743+
s = "shortint unsigned";
744+
else
745+
s = "bit[" + to_string(left) + ":" + to_string(right) + "]";
735746
}
736747
else if(type.id() == ID_bool)
737748
{
738749
s = "bit";
739750
}
740751
else if(type.id() == ID_signedbv || type.id() == ID_verilog_signedbv)
741752
{
742-
s = "bit signed[" + to_string(left) + ":" + to_string(right) + "]";
753+
if(verilog_type == ID_verilog_byte)
754+
s = "byte";
755+
else if(verilog_type == ID_verilog_int)
756+
s = "int";
757+
else if(verilog_type == ID_verilog_longint)
758+
s = "longint";
759+
else if(verilog_type == ID_verilog_shortint)
760+
s = "shortint";
761+
else
762+
s = "bit signed[" + to_string(left) + ":" + to_string(right) + "]";
743763
}
744764
else if(type.id() == ID_verilog_realtime)
745765
{

src/verilog/verilog_types.h

+46-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Author: Daniel Kroening, [email protected]
1010
#define CPROVER_VERILOG_TYPES_H
1111

1212
#include <util/bitvector_types.h>
13+
#include <util/ieee_float.h>
1314

1415
/// Used during elaboration only,
1516
/// to signal that a symbol is yet to be elaborated.
@@ -162,6 +163,13 @@ class verilog_real_typet:public typet
162163
{
163164
return 64;
164165
}
166+
167+
typet lower() const
168+
{
169+
auto type = ieee_float_spect::double_precision().to_type();
170+
type.set(ID_C_verilog_type, ID_verilog_real);
171+
return type;
172+
}
165173
};
166174

167175
/// 32-bit floating point
@@ -176,6 +184,13 @@ class verilog_shortreal_typet:public typet
176184
{
177185
return 32;
178186
}
187+
188+
typet lower() const
189+
{
190+
auto type = ieee_float_spect::single_precision().to_type();
191+
type.set(ID_C_verilog_type, ID_verilog_shortreal);
192+
return type;
193+
}
179194
};
180195

181196
/// 64-bit floating point
@@ -190,6 +205,13 @@ class verilog_realtime_typet:public typet
190205
{
191206
return 64;
192207
}
208+
209+
typet lower() const
210+
{
211+
auto type = ieee_float_spect::double_precision().to_type();
212+
type.set(ID_C_verilog_type, ID_verilog_realtime);
213+
return type;
214+
}
193215
};
194216

195217
/// 2-state data type, 16-bit signed integer
@@ -204,6 +226,13 @@ class verilog_shortint_typet : public typet
204226
{
205227
return 16;
206228
}
229+
230+
typet lower() const
231+
{
232+
auto type = signedbv_typet{width()};
233+
type.set(ID_C_verilog_type, ID_verilog_shortint);
234+
return type;
235+
}
207236
};
208237

209238
/// 2-state data type, 32-bit signed integer
@@ -221,7 +250,9 @@ class verilog_int_typet : public typet
221250

222251
typet lower() const
223252
{
224-
return signedbv_typet{width()};
253+
auto type = signedbv_typet{width()};
254+
type.set(ID_C_verilog_type, ID_verilog_int);
255+
return type;
225256
}
226257
};
227258

@@ -237,6 +268,13 @@ class verilog_longint_typet : public typet
237268
{
238269
return 64;
239270
}
271+
272+
typet lower() const
273+
{
274+
auto type = signedbv_typet{width()};
275+
type.set(ID_C_verilog_type, ID_verilog_longint);
276+
return type;
277+
}
240278
};
241279

242280
/// 2-state data type, 8-bit signed integer
@@ -251,6 +289,13 @@ class verilog_byte_typet : public typet
251289
{
252290
return 8;
253291
}
292+
293+
typet lower() const
294+
{
295+
auto type = signedbv_typet{width()};
296+
type.set(ID_C_verilog_type, ID_verilog_byte);
297+
return type;
298+
}
254299
};
255300

256301
/// 2-state data type, for vectors, unsigned

0 commit comments

Comments
 (0)