aboutsummaryrefslogtreecommitdiffstats
path: root/backends/firrtl/firrtl.cc
diff options
context:
space:
mode:
authorJim Lawson <ucbjrl@berkeley.edu>2019-05-21 13:04:56 -0700
committerJim Lawson <ucbjrl@berkeley.edu>2019-05-21 13:04:56 -0700
commita5131e28966757c3c8b79bee838005c0246f6331 (patch)
tree3b572f6a13fdc45f4cdb6ffd1525dd267ca66cd3 /backends/firrtl/firrtl.cc
parent489c555b41330ed9b1d69afdd8f44ef1e9a9be59 (diff)
downloadyosys-a5131e28966757c3c8b79bee838005c0246f6331.tar.gz
yosys-a5131e28966757c3c8b79bee838005c0246f6331.tar.bz2
yosys-a5131e28966757c3c8b79bee838005c0246f6331.zip
Fix static shift operands, neg result type, minor formatting
Static shift operands must be constants. The result of FIRRTL's neg operator is signed. Fix poor indentation for gen_read().
Diffstat (limited to 'backends/firrtl/firrtl.cc')
-rw-r--r--backends/firrtl/firrtl.cc10
1 files changed, 7 insertions, 3 deletions
diff --git a/backends/firrtl/firrtl.cc b/backends/firrtl/firrtl.cc
index fe6bdb8f6..1c7a7351f 100644
--- a/backends/firrtl/firrtl.cc
+++ b/backends/firrtl/firrtl.cc
@@ -146,7 +146,7 @@ struct FirrtlWorker
if (!mask.is_fully_def())
this->ena = SigSpec(RTLIL::Const(1));
}
- string gen_read(const char * /* indent */) {
+ string gen_read(const char * /* indent */) {
log_error("gen_read called on write_port: %s\n", name.c_str());
return stringf("gen_read called on write_port: %s\n", name.c_str());
}
@@ -449,8 +449,10 @@ struct FirrtlWorker
string primop;
bool always_uint = false;
if (cell->type == "$not") primop = "not";
- else if (cell->type == "$neg") primop = "neg";
- else if (cell->type == "$logic_not") {
+ else if (cell->type == "$neg") {
+ primop = "neg";
+ is_signed = true; // Result of "neg" is signed (an SInt).
+ } else if (cell->type == "$logic_not") {
primop = "eq";
a_expr = stringf("%s, UInt(0)", a_expr.c_str());
}
@@ -562,6 +564,7 @@ struct FirrtlWorker
auto b_sig = cell->getPort("\\B");
if (b_sig.is_fully_const()) {
primop = "shl";
+ b_expr = std::to_string(b_sig.as_int());
} else {
primop = "dshl";
// Convert from FIRRTL left shift semantics.
@@ -575,6 +578,7 @@ struct FirrtlWorker
auto b_sig = cell->getPort("\\B");
if (b_sig.is_fully_const()) {
primop = "shr";
+ b_expr = std::to_string(b_sig.as_int());
} else {
primop = "dshr";
}