aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2018-12-17 16:26:57 +0100
committerGitHub <noreply@github.com>2018-12-17 16:26:57 +0100
commitce701fd3348f43e66a445ef58e4818adaf3e574d (patch)
tree40b08270c0b3dc8e000c2ea181b0c741bae4d355
parentdc6e63d8cd138ef36ac8cbc892c2f262b7bf01c5 (diff)
parentca866d384e666f27e2cd7bb80950d0a1dd7c0ebd (diff)
downloadyosys-ce701fd3348f43e66a445ef58e4818adaf3e574d.tar.gz
yosys-ce701fd3348f43e66a445ef58e4818adaf3e574d.tar.bz2
yosys-ce701fd3348f43e66a445ef58e4818adaf3e574d.zip
Merge pull request #744 from whitequark/write_verilog_$shift
write_verilog: handle the $shift cell
-rw-r--r--backends/verilog/verilog_backend.cc29
1 files changed, 29 insertions, 0 deletions
diff --git a/backends/verilog/verilog_backend.cc b/backends/verilog/verilog_backend.cc
index 3a47b478f..71db25f98 100644
--- a/backends/verilog/verilog_backend.cc
+++ b/backends/verilog/verilog_backend.cc
@@ -678,6 +678,35 @@ bool dump_cell_expr(std::ostream &f, std::string indent, RTLIL::Cell *cell)
#undef HANDLE_UNIOP
#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")
{
f << stringf("%s" "assign ", indent.c_str());