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)
|
if (found_real)
|
||||||
*found_real = false;
|
*found_real = false;
|
||||||
detectSignWidthWorker(width_hint, sign_hint, found_real);
|
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,
|
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