mirror of https://github.com/YosysHQ/yosys.git
verilog: impose limit on maximum expression width
Designs with unreasonably wide expressions would previously get stuck allocating memory forever.
This commit is contained in:
parent
7d2097b005
commit
c18ddbcd82
|
@ -1000,6 +1000,12 @@ void AstNode::detectSignWidth(int &width_hint, bool &sign_hint, bool *found_real
|
|||
if (found_real)
|
||||
*found_real = false;
|
||||
detectSignWidthWorker(width_hint, sign_hint, found_real);
|
||||
|
||||
constexpr int kWidthLimit = 1 << 24;
|
||||
if (width_hint >= kWidthLimit)
|
||||
log_file_error(filename, location.first_line,
|
||||
"Expression width %d exceeds implementation limit of %d!\n",
|
||||
width_hint, kWidthLimit);
|
||||
}
|
||||
|
||||
static void check_unique_id(RTLIL::Module *module, RTLIL::IdString id,
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
logger -expect error "Expression width 1073741824 exceeds implementation limit of 16777216!" 1
|
||||
read_verilog <<EOF
|
||||
module top(
|
||||
input inp,
|
||||
output out
|
||||
);
|
||||
assign out =
|
||||
{1024 {
|
||||
{1024 {
|
||||
{1024 {
|
||||
inp
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
;
|
||||
endmodule
|
||||
EOF
|
|
@ -0,0 +1,16 @@
|
|||
logger -expect error "Expression width 1073741824 exceeds implementation limit of 16777216!" 1
|
||||
read_verilog <<EOF
|
||||
module top(
|
||||
output out
|
||||
);
|
||||
assign out =
|
||||
{1024 {
|
||||
{1024 {
|
||||
{1024 {
|
||||
1'b1
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
;
|
||||
endmodule
|
||||
EOF
|
Loading…
Reference in New Issue