Detect indefinite widths where definite widths are required.

This commit is contained in:
steve 2000-09-26 05:05:58 +00:00
parent 8b581cef46
commit 79b1c51e68
4 changed files with 83 additions and 5 deletions

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: elab_expr.cc,v 1.28 2000/09/24 17:41:13 steve Exp $" #ident "$Id: elab_expr.cc,v 1.29 2000/09/26 05:05:58 steve Exp $"
#endif #endif
@ -240,7 +240,16 @@ NetExpr* PEConcat::elaborate_expr(Design*des, NetScope*scope) const
assert(parms_[idx]); assert(parms_[idx]);
NetExpr*ex = parms_[idx]->elaborate_expr(des, scope); NetExpr*ex = parms_[idx]->elaborate_expr(des, scope);
if (ex == 0) continue; if (ex == 0) continue;
ex->set_line(*parms_[idx]); ex->set_line(*parms_[idx]);
if (! ex->has_width()) {
cerr << ex->get_line() << ": error: operand of "
<< "concatenation has indefinite width: "
<< *ex << endl;
des->errors += 1;
}
tmp->set(idx, ex); tmp->set(idx, ex);
} }
@ -507,6 +516,9 @@ NetEUnary* PEUnary::elaborate_expr(Design*des, NetScope*scope) const
/* /*
* $Log: elab_expr.cc,v $ * $Log: elab_expr.cc,v $
* Revision 1.29 2000/09/26 05:05:58 steve
* Detect indefinite widths where definite widths are required.
*
* Revision 1.28 2000/09/24 17:41:13 steve * Revision 1.28 2000/09/24 17:41:13 steve
* fix null pointer when elaborating undefined task. * fix null pointer when elaborating undefined task.
* *

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: elab_net.cc,v 1.47 2000/09/17 21:26:15 steve Exp $" #ident "$Id: elab_net.cc,v 1.48 2000/09/26 05:05:58 steve Exp $"
#endif #endif
# include "PExpr.h" # include "PExpr.h"
@ -943,6 +943,21 @@ NetNet* PEConcat::elaborate_net(Design*des, const string&path,
/* Elaborate the operands of the concatenation. */ /* Elaborate the operands of the concatenation. */
for (unsigned idx = 0 ; idx < nets.count() ; idx += 1) { for (unsigned idx = 0 ; idx < nets.count() ; idx += 1) {
/* Look for the special case of an unsized number in a
concatenation expression. Mark this as an error, but
allow elaboration to continue to see if I can find
more errors. */
if (PENumber*tmp = dynamic_cast<PENumber*>(parms_[idx])) {
if (tmp->value().has_len() == false) {
cerr << get_line() << ": error: Number "
<< tmp->value() << " with indefinite size"
<< " in concatenation." << endl;
errors += 1;
}
}
nets[idx] = parms_[idx]->elaborate_net(des, path, 0, nets[idx] = parms_[idx]->elaborate_net(des, path, 0,
rise,fall,decay); rise,fall,decay);
if (nets[idx] == 0) if (nets[idx] == 0)
@ -1427,6 +1442,9 @@ NetNet* PENumber::elaborate_net(Design*des, const string&path,
return net; return net;
} }
cerr << get_line() << ": warning: Number with indefinite size "
<< "in self-determined context." << endl;
/* None of the above tight constraints are present, so make a /* None of the above tight constraints are present, so make a
plausible choice for the width. Try to reduce the width as plausible choice for the width. Try to reduce the width as
much as possible by eliminating high zeros of unsigned much as possible by eliminating high zeros of unsigned
@ -1746,6 +1764,9 @@ NetNet* PEUnary::elaborate_net(Design*des, const string&path,
/* /*
* $Log: elab_net.cc,v $ * $Log: elab_net.cc,v $
* Revision 1.48 2000/09/26 05:05:58 steve
* Detect indefinite widths where definite widths are required.
*
* Revision 1.47 2000/09/17 21:26:15 steve * Revision 1.47 2000/09/17 21:26:15 steve
* Add support for modulus (Eric Aardoom) * Add support for modulus (Eric Aardoom)
* *

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: netlist.cc,v 1.138 2000/09/26 01:35:42 steve Exp $" #ident "$Id: netlist.cc,v 1.139 2000/09/26 05:05:58 steve Exp $"
#endif #endif
# include <cassert> # include <cassert>
@ -1719,6 +1719,16 @@ NetExpr::~NetExpr()
{ {
} }
bool NetExpr::has_sign() const
{
return false;
}
bool NetExpr::has_width() const
{
return true;
}
NetEBAdd::NetEBAdd(char op, NetExpr*l, NetExpr*r) NetEBAdd::NetEBAdd(char op, NetExpr*l, NetExpr*r)
: NetEBinary(op, l, r) : NetEBinary(op, l, r)
{ {
@ -1938,6 +1948,21 @@ NetEConst::~NetEConst()
{ {
} }
const verinum& NetEConst::value() const
{
return value_;
}
bool NetEConst::has_sign() const
{
return value_.has_sign();
}
bool NetEConst::has_width() const
{
return value_.has_len();
}
NetEConst* NetEConst::dup_expr() const NetEConst* NetEConst::dup_expr() const
{ {
NetEConst*tmp = new NetEConst(value_); NetEConst*tmp = new NetEConst(value_);
@ -2395,6 +2420,9 @@ bool NetUDP::sequ_glob_(string input, char output)
/* /*
* $Log: netlist.cc,v $ * $Log: netlist.cc,v $
* Revision 1.139 2000/09/26 05:05:58 steve
* Detect indefinite widths where definite widths are required.
*
* Revision 1.138 2000/09/26 01:35:42 steve * Revision 1.138 2000/09/26 01:35:42 steve
* Remove the obsolete NetEIdent class. * Remove the obsolete NetEIdent class.
* *

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: netlist.h,v 1.167 2000/09/26 01:35:42 steve Exp $" #ident "$Id: netlist.h,v 1.168 2000/09/26 05:05:58 steve Exp $"
#endif #endif
/* /*
@ -810,6 +810,16 @@ class NetExpr : public LineInfo {
// coersion works, then return true. Otherwise, return false. // coersion works, then return true. Otherwise, return false.
virtual bool set_width(unsigned); virtual bool set_width(unsigned);
// This method returns true if the expression is
// signed. Unsigned expressions return false.
virtual bool has_sign() const;
// This returns true if the expression has a definite
// width. This is generally true, but in some cases the
// expression is amorphous and desires a width from its
// environment.
virtual bool has_width() const;
// This method evaluates the expression and returns an // This method evaluates the expression and returns an
// equivilent expression that is reduced as far as compile // equivilent expression that is reduced as far as compile
// time knows how. Essentially, this is designed to fold // time knows how. Essentially, this is designed to fold
@ -847,9 +857,13 @@ class NetEConst : public NetExpr {
explicit NetEConst(const verinum&val); explicit NetEConst(const verinum&val);
~NetEConst(); ~NetEConst();
const verinum&value() const { return value_; } const verinum&value() const;
virtual bool set_width(unsigned w); virtual bool set_width(unsigned w);
virtual bool has_sign() const;
virtual bool has_width() const;
virtual void expr_scan(struct expr_scan_t*) const; virtual void expr_scan(struct expr_scan_t*) const;
virtual void dump(ostream&) const; virtual void dump(ostream&) const;
@ -2781,6 +2795,9 @@ extern ostream& operator << (ostream&, NetNet::Type);
/* /*
* $Log: netlist.h,v $ * $Log: netlist.h,v $
* Revision 1.168 2000/09/26 05:05:58 steve
* Detect indefinite widths where definite widths are required.
*
* Revision 1.167 2000/09/26 01:35:42 steve * Revision 1.167 2000/09/26 01:35:42 steve
* Remove the obsolete NetEIdent class. * Remove the obsolete NetEIdent class.
* *