Fix expression/operator type for compressed assignment/shift.
(cherry picked from commit a7066e3686)
This commit is contained in:
parent
e2aae72880
commit
33db07ab8d
26
elaborate.cc
26
elaborate.cc
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1998-2015 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 1998-2016 Stephen Williams (steve@icarus.com)
|
||||||
* Copyright CERN 2013 / Stephen Williams (steve@icarus.com)
|
* Copyright CERN 2013 / Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
|
|
@ -2457,11 +2457,31 @@ NetProc* PAssign::elaborate_compressed_(Design*des, NetScope*scope) const
|
||||||
// equivalent uncompressed assignments. This means we need
|
// equivalent uncompressed assignments. This means we need
|
||||||
// to take the type of the LHS into account when determining
|
// to take the type of the LHS into account when determining
|
||||||
// the type of the RHS expression.
|
// the type of the RHS expression.
|
||||||
|
bool force_unsigned;
|
||||||
|
switch (op_) {
|
||||||
|
case 'l':
|
||||||
|
case 'r':
|
||||||
|
case 'R':
|
||||||
|
// The right-hand operand of shift operations is
|
||||||
|
// self-determined.
|
||||||
|
force_unsigned = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
force_unsigned = !lv->get_signed();
|
||||||
|
break;
|
||||||
|
}
|
||||||
NetExpr*rv = elaborate_rval_(des, scope, 0, lv->expr_type(),
|
NetExpr*rv = elaborate_rval_(des, scope, 0, lv->expr_type(),
|
||||||
count_lval_width(lv), !lv->get_signed());
|
count_lval_width(lv), force_unsigned);
|
||||||
if (rv == 0) return 0;
|
if (rv == 0) return 0;
|
||||||
|
|
||||||
NetAssign*cur = new NetAssign(lv, op_, rv);
|
// The ivl_target API doesn't support signalling the type
|
||||||
|
// of a lval, so convert arithmetic shifts into logical
|
||||||
|
// shifts now if the lval is unsigned.
|
||||||
|
char op = op_;
|
||||||
|
if ((op == 'R') && !lv->get_signed())
|
||||||
|
op = 'r';
|
||||||
|
|
||||||
|
NetAssign*cur = new NetAssign(lv, op, rv);
|
||||||
cur->set_line(*this);
|
cur->set_line(*this);
|
||||||
|
|
||||||
return cur;
|
return cur;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue