Skip to content

Commit 224fb25

Browse files
authored
Merge pull request #1022 from diffblue/unbased-unsized-literals
SystemVerilog: unbased unsized literals
2 parents 5b14c05 + 187ba98 commit 224fb25

File tree

6 files changed

+60
-1
lines changed

6 files changed

+60
-1
lines changed

CHANGELOG

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
* SystemVerilog: typedefs from package scopes
44
* SystemVerilog: assignment patterns with keys for structs
5+
* SystemVerilog: unbased unsigned literals '0, '1, 'x, 'z
56
* SMV: LTL V operator, xnor operator
67
* SMV: word types and operators
78
* --smv-word-level outputs the model as word-level SMV
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
integer_literals1.sv
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
--
7+
^warning: ignoring
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module main;
2+
3+
p01: assert final ($bits(8'b1)==8);
4+
5+
// 1800-2017 5.7.1L without a given width, the number of bits "shall be at least 32"
6+
p02: assert final ($bits(1)==32);
7+
p03: assert final ($bits('d1)==32);
8+
p04: assert final ($bits('b1)==32);
9+
10+
// simple decimal numbers without size and base are signed
11+
p05: assert final ($typename(1)=="bit signed[31:0]");
12+
13+
// numbers with size or base are unsigned
14+
p06: assert final ($typename('d1)=="bit[31:0]");
15+
p07: assert final ($typename(10'd1)=="bit[9:0]");
16+
17+
// unbased unsized literals
18+
p08: assert final ($typename('0)=="bit[0:0]" && '0===1'b0);
19+
p09: assert final ($typename('1)=="bit[0:0]" && '1===1'b1);
20+
p10: assert final ($typename('x)=="logic[0:0]" && 'x===1'bx);
21+
p11: assert final ($typename('z)=="logic[0:0]" && 'z===1'bz);
22+
23+
endmodule

src/verilog/convert_literals.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,24 @@ constant_exprt convert_integral_literal(const irep_idt &value)
132132
rest += tolower(ch);
133133
}
134134

135+
// special case the "unbased unsized literals"
136+
if(rest == "'0")
137+
{
138+
return from_integer(0, unsignedbv_typet{1});
139+
}
140+
else if(rest == "'1")
141+
{
142+
return from_integer(1, unsignedbv_typet{1});
143+
}
144+
else if(rest == "'x" || rest == "'X")
145+
{
146+
return constant_exprt{"x", verilog_unsignedbv_typet{1}};
147+
}
148+
else if(rest == "'z" || rest == "'Z")
149+
{
150+
return constant_exprt{"z", verilog_unsignedbv_typet{1}};
151+
}
152+
135153
std::string::size_type pos = rest.find('\'');
136154
std::size_t bits = 0;
137155
bool bits_given = false;

src/verilog/scanner.l

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ Binary ({Number})?{WSst}'{WSst}[sS]?[bB]{WSst}[01xXzZ?]([01xXzZ?_])*
128128
Octal ({Number})?{WSst}'{WSst}[sS]?[oO]{WSst}[0-7xXzZ?]([0-7xXzZ?_])*
129129
Decimal ({Number})?{WSst}'{WSst}[sS]?[dD]{WSst}{Number}
130130
Hexdecimal ({Number})?{WSst}'{WSst}[sS]?[hH]{WSst}[0-9a-fA-FxXzZ?]([0-9a-fA-FxXzZ?_])*
131+
unbased_unsized '0|'1|'x|'X|'z|'Z
131132
Time {Number}(\.{Number})?("fs"|"ps"|"ns"|"us"|"ms"|"s")
132133
Real {Number}\.{Number}
133134
RealExp {Number}(\.{Number})?[eE][+-]?{Number}
@@ -572,6 +573,7 @@ prove { VL2SMV_VERILOG_KEYWORD(TOK_PROVE); }
572573
{Decimal} { newstack(yyveriloglval); stack_expr(yyveriloglval).id(yytext); return TOK_NUMBER; }
573574
{Hexdecimal} { newstack(yyveriloglval); stack_expr(yyveriloglval).id(yytext); return TOK_NUMBER; }
574575
{Number} { newstack(yyveriloglval); stack_expr(yyveriloglval).id(yytext); return TOK_NUMBER; }
576+
{unbased_unsized} { newstack(yyveriloglval); stack_expr(yyveriloglval).id(yytext); return TOK_NUMBER; }
575577
{Time} { newstack(yyveriloglval); stack_expr(yyveriloglval).id(yytext); return TOK_TIME_LITERAL; }
576578
{Real} { newstack(yyveriloglval); stack_expr(yyveriloglval).id(yytext); return TOK_NUMBER; }
577579
{RealExp} { newstack(yyveriloglval); stack_expr(yyveriloglval).id(yytext); return TOK_NUMBER; }

src/verilog/verilog_typecheck_expr.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ exprt verilog_typecheck_exprt::typename_string(const exprt &expr)
731731

732732
std::string s;
733733

734-
if(type.id() == ID_unsignedbv || type.id() == ID_verilog_unsignedbv)
734+
if(type.id() == ID_unsignedbv)
735735
{
736736
if(verilog_type == ID_verilog_byte)
737737
s = "byte unsigned";
@@ -744,6 +744,10 @@ exprt verilog_typecheck_exprt::typename_string(const exprt &expr)
744744
else
745745
s = "bit[" + to_string(left) + ":" + to_string(right) + "]";
746746
}
747+
else if(type.id() == ID_verilog_unsignedbv)
748+
{
749+
s = "logic[" + to_string(left) + ":" + to_string(right) + "]";
750+
}
747751
else if(type.id() == ID_bool)
748752
{
749753
s = "bit";
@@ -761,6 +765,10 @@ exprt verilog_typecheck_exprt::typename_string(const exprt &expr)
761765
else
762766
s = "bit signed[" + to_string(left) + ":" + to_string(right) + "]";
763767
}
768+
else if(type.id() == ID_verilog_signedbv)
769+
{
770+
s = "logic signed[" + to_string(left) + ":" + to_string(right) + "]";
771+
}
764772
else if(type.id() == ID_verilog_realtime)
765773
{
766774
s = "realtime";

0 commit comments

Comments
 (0)