mirror of https://github.com/YosysHQ/yosys.git
Merge branch 'YosysHQ:main' into main
This commit is contained in:
commit
7e9e4c7afe
2
Makefile
2
Makefile
|
|
@ -176,7 +176,7 @@ ifeq ($(OS), Haiku)
|
|||
CXXFLAGS += -D_DEFAULT_SOURCE
|
||||
endif
|
||||
|
||||
YOSYS_VER := 0.54+15
|
||||
YOSYS_VER := 0.54+17
|
||||
YOSYS_MAJOR := $(shell echo $(YOSYS_VER) | cut -d'.' -f1)
|
||||
YOSYS_MINOR := $(shell echo $(YOSYS_VER) | cut -d'.' -f2)
|
||||
YOSYS_COMMIT := $(shell echo $(YOSYS_VER) | cut -d'.' -f3)
|
||||
|
|
|
|||
|
|
@ -336,7 +336,7 @@ TIME_SCALE_SUFFIX [munpf]?s
|
|||
}
|
||||
|
||||
\" { BEGIN(STRING); }
|
||||
<STRING>([^\"]|\\.)+ { yymore(); real_location = old_location; }
|
||||
<STRING>([^\\"]|\\.)+ { yymore(); real_location = old_location; }
|
||||
<STRING>\" {
|
||||
BEGIN(0);
|
||||
char *yystr = strdup(yytext);
|
||||
|
|
|
|||
|
|
@ -2874,6 +2874,7 @@ behavioral_stmt:
|
|||
} |
|
||||
if_attr TOK_IF '(' expr ')' {
|
||||
AstNode *node = 0;
|
||||
AstNode *block = new AstNode(AST_BLOCK);
|
||||
AstNode *context = ast_stack.back();
|
||||
if (context && context->type == AST_BLOCK && context->get_bool_attribute(ID::promoted_if)) {
|
||||
AstNode *outer = ast_stack[ast_stack.size() - 2];
|
||||
|
|
@ -2882,8 +2883,10 @@ behavioral_stmt:
|
|||
// parallel "else if": append condition to outer "if"
|
||||
node = outer;
|
||||
log_assert (node->children.size());
|
||||
ast_stack.pop_back();
|
||||
delete node->children.back();
|
||||
node->children.pop_back();
|
||||
ast_stack.push_back(block);
|
||||
} else if (outer->get_bool_attribute(ID::full_case))
|
||||
(*$1)[ID::full_case] = AstNode::mkconst_int(1, false);
|
||||
}
|
||||
|
|
@ -2894,8 +2897,8 @@ behavioral_stmt:
|
|||
append_attr(node, $1);
|
||||
ast_stack.back()->children.push_back(node);
|
||||
node->children.push_back(node->get_bool_attribute(ID::parallel_case) ? AstNode::mkconst_int(1, false, 1) : expr);
|
||||
}
|
||||
AstNode *block = new AstNode(AST_BLOCK);
|
||||
} else
|
||||
free_attr($1);
|
||||
AstNode *cond = new AstNode(AST_COND, node->get_bool_attribute(ID::parallel_case) ? expr : AstNode::mkconst_int(1, false, 1), block);
|
||||
SET_AST_NODE_LOC(cond, @4, @4);
|
||||
node->children.push_back(cond);
|
||||
|
|
|
|||
|
|
@ -760,7 +760,11 @@ struct OptDffWorker
|
|||
ModWalker modwalker(module->design, module);
|
||||
QuickConeSat qcsat(modwalker);
|
||||
|
||||
// Run as a separate sub-pass, so that we don't mutate (non-FF) cells under ModWalker.
|
||||
// Defer mutating cells by removing them/emiting new flip flops so that
|
||||
// cell references in modwalker are not invalidated
|
||||
std::vector<RTLIL::Cell*> cells_to_remove;
|
||||
std::vector<FfData> ffs_to_emit;
|
||||
|
||||
bool did_something = false;
|
||||
for (auto cell : module->selected_cells()) {
|
||||
if (!RTLIL::builtin_ff_cell_types().count(cell->type))
|
||||
|
|
@ -852,16 +856,20 @@ struct OptDffWorker
|
|||
if (!removed_sigbits.count(i))
|
||||
keep_bits.push_back(i);
|
||||
if (keep_bits.empty()) {
|
||||
module->remove(cell);
|
||||
cells_to_remove.emplace_back(cell);
|
||||
did_something = true;
|
||||
continue;
|
||||
}
|
||||
ff = ff.slice(keep_bits);
|
||||
ff.cell = cell;
|
||||
ff.emit();
|
||||
ffs_to_emit.emplace_back(ff);
|
||||
did_something = true;
|
||||
}
|
||||
}
|
||||
for (auto* cell : cells_to_remove)
|
||||
module->remove(cell);
|
||||
for (auto& ff : ffs_to_emit)
|
||||
ff.emit();
|
||||
return did_something;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,60 @@
|
|||
read_rtlil <<EOT
|
||||
module \module137
|
||||
wire input 1 \clk
|
||||
wire width 1 output 1 \qa
|
||||
wire width 1 \qb
|
||||
cell $dff \dffa
|
||||
parameter \CLK_POLARITY 1
|
||||
parameter \WIDTH 1
|
||||
connect \CLK \clk
|
||||
connect \D \qb
|
||||
connect \Q \qa
|
||||
end
|
||||
cell $dff \dffb
|
||||
parameter \CLK_POLARITY 1
|
||||
parameter \WIDTH 1
|
||||
connect \CLK \clk
|
||||
connect \D 1'x
|
||||
connect \Q \qb
|
||||
end
|
||||
end
|
||||
EOT
|
||||
equiv_opt -assert opt_dff -sat
|
||||
|
||||
design -reset
|
||||
|
||||
read_rtlil <<EOT
|
||||
module \module137
|
||||
wire output 1 width 9 $2\reg204[8:0]
|
||||
wire input 1 \clk
|
||||
wire width 9 $auto$wreduce.cc:514:run$19340
|
||||
wire width 9 $auto$wreduce.cc:514:run$19341
|
||||
wire width 15 \dffout
|
||||
attribute \init 9'000000000
|
||||
wire width 9 \reg204
|
||||
cell $dff $auto$ff.cc:266:slice$26225
|
||||
parameter \CLK_POLARITY 1
|
||||
parameter \WIDTH 15
|
||||
connect \CLK \clk
|
||||
connect \D { 9'x \reg204 [8:3] }
|
||||
connect \Q \dffout
|
||||
end
|
||||
cell $dff $auto$ff.cc:266:slice$26292
|
||||
parameter \CLK_POLARITY 1
|
||||
parameter \WIDTH 9
|
||||
connect \CLK \clk
|
||||
connect \D $2\reg204[8:0]
|
||||
connect \Q \reg204
|
||||
end
|
||||
cell $mux $procmux$4510
|
||||
parameter \WIDTH 9
|
||||
connect \A 9'x
|
||||
connect \B 9'x
|
||||
connect \S 1'x
|
||||
connect \Y $auto$wreduce.cc:514:run$19340
|
||||
end
|
||||
connect $2\reg204[8:0] $auto$wreduce.cc:514:run$19340
|
||||
connect $auto$wreduce.cc:514:run$19341 [8:3] 6'000000
|
||||
end
|
||||
EOT
|
||||
equiv_opt -assert opt_dff -sat
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
// Regression test for bug mentioned in #5160:
|
||||
// https://github.com/YosysHQ/yosys/pull/5160#issuecomment-2983643084
|
||||
module top;
|
||||
initial $display( "\\" );
|
||||
endmodule
|
||||
Loading…
Reference in New Issue