Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Catch unsized expressions in continuous assigns.

  • Loading branch information...
commit d1f0bcf6201d6c8c8cfc710b756c054b616d8740 1 parent 933f448
steve authored
Showing with 30 additions and 3 deletions.
  1. +30 −3 elab_net.cc
View
33 elab_net.cc
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
-#ident "$Id: elab_net.cc,v 1.119 2003/09/19 03:50:12 steve Exp $"
+#ident "$Id: elab_net.cc,v 1.120 2003/09/23 03:31:28 steve Exp $"
#endif
# include "config.h"
@@ -29,6 +29,15 @@
# include <iostream>
+/*
+ * This is a state flag that determines whether an elaborate_net must
+ * report an error when it encounters an unsized number. Normally, it
+ * is fine to make an unsized number as small as it can be, but there
+ * are a few cases where the size must be fully self-determined. For
+ * example, within a {...} (concatenation) operator.
+ */
+static bool must_be_self_determined_flag = false;
+
NetNet* PExpr::elaborate_net(Design*des, NetScope*scope, unsigned,
unsigned long,
unsigned long,
@@ -615,9 +624,9 @@ NetNet* PEBinary::elaborate_net_div_(Design*des, NetScope*scope,
unsigned long fall,
unsigned long decay) const
{
- NetNet*lsig = left_->elaborate_net(des, scope, 0, 0, 0, 0);
+ NetNet*lsig = left_->elaborate_net(des, scope, lwidth, 0, 0, 0);
if (lsig == 0) return 0;
- NetNet*rsig = right_->elaborate_net(des, scope, 0, 0, 0, 0);
+ NetNet*rsig = right_->elaborate_net(des, scope, lwidth, 0, 0, 0);
if (rsig == 0) return 0;
@@ -1174,6 +1183,12 @@ NetNet* PEConcat::elaborate_net(Design*des, NetScope*scope,
}
}
+ /* The operands of the concatenation must contain all
+ self-determined arguments. Set this flag to force an error
+ message if this is not the case. */
+ const bool save_flag = must_be_self_determined_flag;
+ must_be_self_determined_flag = true;
+
/* Elaborate the operands of the concatenation. */
for (unsigned idx = 0 ; idx < nets.count() ; idx += 1) {
@@ -1206,6 +1221,8 @@ NetNet* PEConcat::elaborate_net(Design*des, NetScope*scope,
pins += nets[idx]->pin_count();
}
+ must_be_self_determined_flag = save_flag;
+
/* If any of the sub expressions failed to elaborate, then
delete all those that did and abort myself. */
if (errors) {
@@ -1879,6 +1896,13 @@ NetNet* PENumber::elaborate_net(Design*des, NetScope*scope,
plausible choice for the width. Try to reduce the width as
much as possible by eliminating high zeros of unsigned
numbers. */
+
+ if (must_be_self_determined_flag) {
+ cerr << get_line() << ": error: No idea how wide to make "
+ << "the unsized constant " << *value_ << "." << endl;
+ des->errors += 1;
+ }
+
unsigned width = value_->len();
if (value_->has_sign() && (value_->get(width-1) == verinum::V0)) {
@@ -2363,6 +2387,9 @@ NetNet* PEUnary::elaborate_net(Design*des, NetScope*scope,
/*
* $Log: elab_net.cc,v $
+ * Revision 1.120 2003/09/23 03:31:28 steve
+ * Catch unsized expressions in continuous assigns.
+ *
* Revision 1.119 2003/09/19 03:50:12 steve
* Remove find_memory method from Design class.
*
Please sign in to comment.
Something went wrong with that request. Please try again.