Support decimal constants in behavioral delays.

This commit is contained in:
steve 2000-12-10 22:01:35 +00:00
parent c0f951c146
commit 084a464cf1
11 changed files with 197 additions and 13 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: PExpr.cc,v 1.19 2000/06/30 15:50:20 steve Exp $" #ident "$Id: PExpr.cc,v 1.20 2000/12/10 22:01:35 steve Exp $"
#endif #endif
# include "PExpr.h" # include "PExpr.h"
@ -118,6 +118,21 @@ PExpr* PEEvent::expr() const
return expr_; return expr_;
} }
PEFNumber::PEFNumber(verireal*v)
: value_(v)
{
}
PEFNumber::~PEFNumber()
{
delete value_;
}
const verireal& PEFNumber::value() const
{
return *value_;
}
PEIdent::PEIdent(const string&s) PEIdent::PEIdent(const string&s)
: text_(s), msb_(0), lsb_(0), idx_(0) : text_(s), msb_(0), lsb_(0), idx_(0)
{ {
@ -228,6 +243,9 @@ bool PEUnary::is_constant(Module*m) const
/* /*
* $Log: PExpr.cc,v $ * $Log: PExpr.cc,v $
* Revision 1.20 2000/12/10 22:01:35 steve
* Support decimal constants in behavioral delays.
*
* Revision 1.19 2000/06/30 15:50:20 steve * Revision 1.19 2000/06/30 15:50:20 steve
* Allow unary operators in constant expressions. * Allow unary operators in constant expressions.
* *

27
PExpr.h
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: PExpr.h,v 1.45 2000/12/06 06:31:09 steve Exp $" #ident "$Id: PExpr.h,v 1.46 2000/12/10 22:01:35 steve Exp $"
#endif #endif
# include <string> # include <string>
@ -163,6 +163,28 @@ class PEEvent : public PExpr {
PExpr *expr_; PExpr *expr_;
}; };
/*
* This holds a floating point constant in the source.
*/
class PEFNumber : public PExpr {
public:
explicit PEFNumber(verireal*vp);
~PEFNumber();
const verireal& value() const;
/* The eval_const method as applied to a floating point number
gets the *integer* value of the number. This accounts for
any rounding that is needed to get the value. */
virtual verinum* eval_const(const Design*des, const string&path) const;
virtual void dump(ostream&) const;
private:
verireal*value_;
};
class PEIdent : public PExpr { class PEIdent : public PExpr {
public: public:
@ -409,6 +431,9 @@ class PECallFunction : public PExpr {
/* /*
* $Log: PExpr.h,v $ * $Log: PExpr.h,v $
* Revision 1.46 2000/12/10 22:01:35 steve
* Support decimal constants in behavioral delays.
*
* Revision 1.45 2000/12/06 06:31:09 steve * Revision 1.45 2000/12/06 06:31:09 steve
* Check lvalue of procedural continuous assign (PR#29) * Check lvalue of procedural continuous assign (PR#29)
* *

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.30 2000/11/29 05:24:00 steve Exp $" #ident "$Id: elab_expr.cc,v 1.31 2000/12/10 22:01:35 steve Exp $"
#endif #endif
@ -26,8 +26,11 @@
NetExpr* PExpr::elaborate_expr(Design*des, NetScope*) const NetExpr* PExpr::elaborate_expr(Design*des, NetScope*) const
{ {
cerr << get_line() << ": I do not know how to elaborate expression: " cerr << get_line() << ": internal error: I do not know how to elaborate"
<< *this << endl; << " expression. " << endl;
cerr << get_line() << ": : Expression is: " << *this
<< endl;
des->errors += 1;
return 0; return 0;
} }
@ -526,6 +529,9 @@ NetEUnary* PEUnary::elaborate_expr(Design*des, NetScope*scope) const
/* /*
* $Log: elab_expr.cc,v $ * $Log: elab_expr.cc,v $
* Revision 1.31 2000/12/10 22:01:35 steve
* Support decimal constants in behavioral delays.
*
* Revision 1.30 2000/11/29 05:24:00 steve * Revision 1.30 2000/11/29 05:24:00 steve
* synthesis for unary reduction ! and N operators. * synthesis for unary reduction ! and N operators.
* *

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: elaborate.cc,v 1.200 2000/12/10 06:41:59 steve Exp $" #ident "$Id: elaborate.cc,v 1.201 2000/12/10 22:01:36 steve Exp $"
#endif #endif
/* /*
@ -1537,6 +1537,24 @@ NetProc* PDelayStatement::elaborate(Design*des, const string&path) const
NetScope*scope = des->find_scope(path); NetScope*scope = des->find_scope(path);
assert(scope); assert(scope);
/* Catch the special case that the delay is given as a
floating point number. In this case, we need to scale the
delay to the units of the design. */
if (const PEFNumber*fn = dynamic_cast<const PEFNumber*>(delay_)) {
int shift = scope->time_unit() - des->get_precision();
long delay = fn->value().as_long(shift);
if (delay < 0)
delay = 0;
if (statement_)
return new NetPDelay(delay, statement_->elaborate(des, path));
else
return new NetPDelay(delay, 0);
}
verinum*num = delay_->eval_const(des, path); verinum*num = delay_->eval_const(des, path);
if (num == 0) { if (num == 0) {
/* Ah, the delay is not constant. OK, elaborate the /* Ah, the delay is not constant. OK, elaborate the
@ -2336,6 +2354,9 @@ Design* elaborate(const map<string,Module*>&modules,
/* /*
* $Log: elaborate.cc,v $ * $Log: elaborate.cc,v $
* Revision 1.201 2000/12/10 22:01:36 steve
* Support decimal constants in behavioral delays.
*
* Revision 1.200 2000/12/10 06:41:59 steve * Revision 1.200 2000/12/10 06:41:59 steve
* Support delays on continuous assignment from idents. (PR#40) * Support delays on continuous assignment from idents. (PR#40)
* *

11
eval.cc
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: eval.cc,v 1.15 2000/09/07 22:38:13 steve Exp $" #ident "$Id: eval.cc,v 1.16 2000/12/10 22:01:36 steve Exp $"
#endif #endif
# include "PExpr.h" # include "PExpr.h"
@ -116,6 +116,12 @@ verinum* PEIdent::eval_const(const Design*des, const string&path) const
return new verinum(eval->value()); return new verinum(eval->value());
} }
verinum* PEFNumber::eval_const(const Design*, const string&) const
{
long val = value_->as_long();
return new verinum(val);
}
verinum* PENumber::eval_const(const Design*, const string&) const verinum* PENumber::eval_const(const Design*, const string&) const
{ {
return new verinum(value()); return new verinum(value());
@ -163,6 +169,9 @@ verinum* PEUnary::eval_const(const Design*des, const string&path) const
/* /*
* $Log: eval.cc,v $ * $Log: eval.cc,v $
* Revision 1.16 2000/12/10 22:01:36 steve
* Support decimal constants in behavioral delays.
*
* Revision 1.15 2000/09/07 22:38:13 steve * Revision 1.15 2000/09/07 22:38:13 steve
* Support unary + and - in constants. * Support unary + and - in constants.
* *

13
parse.y
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: parse.y,v 1.111 2000/12/06 06:31:09 steve Exp $" #ident "$Id: parse.y,v 1.112 2000/12/10 22:01:36 steve Exp $"
#endif #endif
# include "parse_misc.h" # include "parse_misc.h"
@ -372,6 +372,17 @@ delay_value_simple
$$->set_lineno(@1.first_line); $$->set_lineno(@1.first_line);
} }
} }
| REALTIME
{ verireal*tmp = $1;
if (tmp == 0) {
yyerror(@1, "internal error: delay.");
$$ = 0;
} else {
$$ = new PEFNumber(tmp);
$$->set_file(@1.text);
$$->set_lineno(@1.first_line);
}
}
| IDENTIFIER | IDENTIFIER
{ PEIdent*tmp = new PEIdent($1); { PEIdent*tmp = new PEIdent($1);
tmp->set_file(@1.text); tmp->set_file(@1.text);

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: pform_dump.cc,v 1.63 2000/11/11 01:52:09 steve Exp $" #ident "$Id: pform_dump.cc,v 1.64 2000/12/10 22:01:36 steve Exp $"
#endif #endif
/* /*
@ -128,6 +128,11 @@ void PEEvent::dump(ostream&out) const
} }
void PEFNumber::dump(ostream &out) const
{
out << value();
}
void PENumber::dump(ostream&out) const void PENumber::dump(ostream&out) const
{ {
out << value(); out << value();
@ -801,6 +806,9 @@ void PUdp::dump(ostream&out) const
/* /*
* $Log: pform_dump.cc,v $ * $Log: pform_dump.cc,v $
* Revision 1.64 2000/12/10 22:01:36 steve
* Support decimal constants in behavioral delays.
*
* Revision 1.63 2000/11/11 01:52:09 steve * Revision 1.63 2000/11/11 01:52:09 steve
* change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1 * change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1
* change set to correct behavior of bufif0 and bufif1 * change set to correct behavior of bufif0 and bufif1

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: verinum.cc,v 1.20 2000/09/28 03:55:55 steve Exp $" #ident "$Id: verinum.cc,v 1.21 2000/12/10 22:01:36 steve Exp $"
#endif #endif
# include "verinum.h" # include "verinum.h"
@ -103,6 +103,25 @@ verinum::verinum(const verinum&that, unsigned nbits)
bits_[idx] = that.bits_[idx]; bits_[idx] = that.bits_[idx];
} }
verinum::verinum(long that)
: has_len_(false), has_sign_(true), string_flag_(false)
{
long tmp;
tmp = that/2;
nbits_ = 1;
while ((tmp != 0) && (tmp != -1)) {
nbits_ += 1;
tmp /= 2;
}
bits_ = new V[nbits_];
for (unsigned idx = 0 ; idx < nbits_ ; idx += 1) {
bits_[idx] = (that & 1)? V1 : V0;
that /= 2;
}
}
verinum::~verinum() verinum::~verinum()
{ {
delete[]bits_; delete[]bits_;
@ -531,6 +550,9 @@ verinum operator * (const verinum&left, const verinum&right)
/* /*
* $Log: verinum.cc,v $ * $Log: verinum.cc,v $
* Revision 1.21 2000/12/10 22:01:36 steve
* Support decimal constants in behavioral delays.
*
* Revision 1.20 2000/09/28 03:55:55 steve * Revision 1.20 2000/09/28 03:55:55 steve
* handel, by truncation, verinums that are to long for long integers. * handel, by truncation, verinums that are to long for long integers.
* *

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: verinum.h,v 1.12 2000/09/27 18:28:37 steve Exp $" #ident "$Id: verinum.h,v 1.13 2000/12/10 22:01:36 steve Exp $"
#endif #endif
# include <string> # include <string>
@ -42,6 +42,9 @@ class verinum {
verinum(unsigned long val, unsigned bits); verinum(unsigned long val, unsigned bits);
verinum(const verinum&); verinum(const verinum&);
// Create a signed number, with an unspecified number of bits.
explicit verinum(long val);
// Copy only the specified number of bits from the // Copy only the specified number of bits from the
// source. Also mark this number as has_len. // source. Also mark this number as has_len.
verinum(const verinum&, unsigned bits); verinum(const verinum&, unsigned bits);
@ -108,6 +111,9 @@ extern verinum v_not(const verinum&left);
/* /*
* $Log: verinum.h,v $ * $Log: verinum.h,v $
* Revision 1.13 2000/12/10 22:01:36 steve
* Support decimal constants in behavioral delays.
*
* Revision 1.12 2000/09/27 18:28:37 steve * Revision 1.12 2000/09/27 18:28:37 steve
* multiply in parameter expressions. * multiply in parameter expressions.
* *

View File

@ -17,11 +17,12 @@
* 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: verireal.cc,v 1.2 2000/02/23 02:56:56 steve Exp $" #ident "$Id: verireal.cc,v 1.3 2000/12/10 22:01:36 steve Exp $"
#endif #endif
# include "verireal.h" # include "verireal.h"
# include <ctype.h> # include <ctype.h>
# include <iostream>
# include <assert.h> # include <assert.h>
verireal::verireal() verireal::verireal()
@ -90,8 +91,41 @@ verireal::~verireal()
{ {
} }
long verireal::as_long(int shift) const
{
long val = mant_;
int ex = exp10_ + shift;
while (ex < 0) {
long mod = val % 10;
val /= 10;
if (mod >= 5)
val += 1;
ex += 1;
}
while (ex > 0) {
val *= 10;
ex -= 1;
}
if (sign_)
return -val;
else
return val;
}
ostream& operator<< (ostream&out, const verireal&v)
{
out << (v.sign_? "-" : "+") << v.mant_ << "e" << v.exp10_;
}
/* /*
* $Log: verireal.cc,v $ * $Log: verireal.cc,v $
* Revision 1.3 2000/12/10 22:01:36 steve
* Support decimal constants in behavioral delays.
*
* Revision 1.2 2000/02/23 02:56:56 steve * Revision 1.2 2000/02/23 02:56:56 steve
* Macintosh compilers do not support ident. * Macintosh compilers do not support ident.
* *

View File

@ -19,24 +19,48 @@
* 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: verireal.h,v 1.2 2000/02/23 02:56:56 steve Exp $" #ident "$Id: verireal.h,v 1.3 2000/12/10 22:01:36 steve Exp $"
#endif #endif
class ostream;
/*
* This class holds a floating point decimal number. The number is
* stored as an integer mantissa and a power of 10. The mantissa is an
* integer so that decimal numbers in the source (which are decimal)
* can be stored exactly.
*/
class verireal { class verireal {
friend ostream& operator<< (ostream&, const verireal&);
public: public:
explicit verireal(); explicit verireal();
explicit verireal(const char*text); explicit verireal(const char*text);
~verireal(); ~verireal();
/* Return the value of the floating point number as an
integer, rounded as needed. The shift is the power of 10 to
multiply the value before calculating the result. So for
example if the value is 2.5 and shift == 1, the result
is 25. */
long as_long(int shift =0) const;
private: private:
bool sign_; bool sign_;
unsigned long mant_; unsigned long mant_;
signed int exp10_; signed int exp10_;
}; };
extern ostream& operator<< (ostream&, const verireal&);
/* /*
* $Log: verireal.h,v $ * $Log: verireal.h,v $
* Revision 1.3 2000/12/10 22:01:36 steve
* Support decimal constants in behavioral delays.
*
* Revision 1.2 2000/02/23 02:56:56 steve * Revision 1.2 2000/02/23 02:56:56 steve
* Macintosh compilers do not support ident. * Macintosh compilers do not support ident.
* *