mirror of
https://github.com/YosysHQ/yosys
synced 2025-10-23 07:54:35 +00:00
write_verilog: handle the $shift cell.
The implementation corresponds to the following Verilog, which is
lifted straight from simlib.v:
module \\$shift (A, B, Y);
parameter A_SIGNED = 0;
parameter B_SIGNED = 0;
parameter A_WIDTH = 0;
parameter B_WIDTH = 0;
parameter Y_WIDTH = 0;
input [A_WIDTH-1:0] A;
input [B_WIDTH-1:0] B;
output [Y_WIDTH-1:0] Y;
generate
if (B_SIGNED) begin:BLOCK1
assign Y = $signed(B) < 0 ? A << -B : A >> B;
end else begin:BLOCK2
assign Y = A >> B;
end
endgenerate
endmodule
This commit is contained in:
parent
ddff75b60a
commit
ca866d384e
1 changed files with 29 additions and 0 deletions
|
|
@ -678,6 +678,35 @@ bool dump_cell_expr(std::ostream &f, std::string indent, RTLIL::Cell *cell)
|
||||||
#undef HANDLE_UNIOP
|
#undef HANDLE_UNIOP
|
||||||
#undef HANDLE_BINOP
|
#undef HANDLE_BINOP
|
||||||
|
|
||||||
|
if (cell->type == "$shift")
|
||||||
|
{
|
||||||
|
f << stringf("%s" "assign ", indent.c_str());
|
||||||
|
dump_sigspec(f, cell->getPort("\\Y"));
|
||||||
|
f << stringf(" = ");
|
||||||
|
if (cell->getParam("\\B_SIGNED").as_bool())
|
||||||
|
{
|
||||||
|
f << stringf("$signed(");
|
||||||
|
dump_sigspec(f, cell->getPort("\\B"));
|
||||||
|
f << stringf(")");
|
||||||
|
f << stringf(" < 0 ? ");
|
||||||
|
dump_sigspec(f, cell->getPort("\\A"));
|
||||||
|
f << stringf(" << - ");
|
||||||
|
dump_sigspec(f, cell->getPort("\\B"));
|
||||||
|
f << stringf(" : ");
|
||||||
|
dump_sigspec(f, cell->getPort("\\A"));
|
||||||
|
f << stringf(" >> ");
|
||||||
|
dump_sigspec(f, cell->getPort("\\B"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dump_sigspec(f, cell->getPort("\\A"));
|
||||||
|
f << stringf(" >> ");
|
||||||
|
dump_sigspec(f, cell->getPort("\\B"));
|
||||||
|
}
|
||||||
|
f << stringf(";\n");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (cell->type == "$shiftx")
|
if (cell->type == "$shiftx")
|
||||||
{
|
{
|
||||||
f << stringf("%s" "assign ", indent.c_str());
|
f << stringf("%s" "assign ", indent.c_str());
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue