elaborate concatenation repeats.
This commit is contained in:
parent
d904aceb2c
commit
4594ac1c2c
7
PExpr.cc
7
PExpr.cc
|
|
@ -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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: PExpr.cc,v 1.8 1999/09/15 04:17:52 steve Exp $"
|
#ident "$Id: PExpr.cc,v 1.9 1999/09/16 04:18:15 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "PExpr.h"
|
# include "PExpr.h"
|
||||||
|
|
@ -62,7 +62,7 @@ bool PEBinary::is_constant(Module*mod) const
|
||||||
|
|
||||||
bool PEConcat::is_constant(Module *mod) const
|
bool PEConcat::is_constant(Module *mod) const
|
||||||
{
|
{
|
||||||
bool constant = repeat_->is_constant(mod);
|
bool constant = repeat_? repeat_->is_constant(mod) : true;
|
||||||
for (unsigned i = 0; constant && i < parms_.count(); ++i) {
|
for (unsigned i = 0; constant && i < parms_.count(); ++i) {
|
||||||
constant = constant && parms_[i]->is_constant(mod);
|
constant = constant && parms_[i]->is_constant(mod);
|
||||||
}
|
}
|
||||||
|
|
@ -119,6 +119,9 @@ bool PETernary::is_constant(Module*) const
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: PExpr.cc,v $
|
* $Log: PExpr.cc,v $
|
||||||
|
* Revision 1.9 1999/09/16 04:18:15 steve
|
||||||
|
* elaborate concatenation repeats.
|
||||||
|
*
|
||||||
* Revision 1.8 1999/09/15 04:17:52 steve
|
* Revision 1.8 1999/09/15 04:17:52 steve
|
||||||
* separate assign lval elaboration for error checking.
|
* separate assign lval elaboration for error checking.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
28
elaborate.cc
28
elaborate.cc
|
|
@ -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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: elaborate.cc,v 1.87 1999/09/16 00:33:45 steve Exp $"
|
#ident "$Id: elaborate.cc,v 1.88 1999/09/16 04:18:15 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1370,17 +1370,32 @@ NetExpr* PEBinary::elaborate_expr(Design*des, const string&path) const
|
||||||
|
|
||||||
NetExpr* PEConcat::elaborate_expr(Design*des, const string&path) const
|
NetExpr* PEConcat::elaborate_expr(Design*des, const string&path) const
|
||||||
{
|
{
|
||||||
|
unsigned repeat = 1;
|
||||||
|
|
||||||
|
/* If there is a repeat expression, then evaluate the constant
|
||||||
|
value and set the repeat count. */
|
||||||
if (repeat_) {
|
if (repeat_) {
|
||||||
cerr << get_line() << ": Sorry, I do not know how to"
|
verinum*vrep = repeat_->eval_const(des, path);
|
||||||
" elaborate repeat concatenation expressions." << endl;
|
if (vrep == 0) {
|
||||||
return 0;
|
cerr << get_line() << ": concatenation repeat expression"
|
||||||
|
" cannot be evaluated." << endl;
|
||||||
|
des->errors += 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
repeat = vrep->as_ulong();
|
||||||
|
delete vrep;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetEConcat*tmp = new NetEConcat(parms_.count());
|
/* Make the empty concat expression. */
|
||||||
|
NetEConcat*tmp = new NetEConcat(parms_.count(), repeat);
|
||||||
tmp->set_line(*this);
|
tmp->set_line(*this);
|
||||||
|
|
||||||
|
/* Elaborate all the parameters and attach them to the concat node. */
|
||||||
for (unsigned idx = 0 ; idx < parms_.count() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < parms_.count() ; idx += 1) {
|
||||||
assert(parms_[idx]);
|
assert(parms_[idx]);
|
||||||
|
NetExpr*ex = parms_[idx]->elaborate_expr(des, path);
|
||||||
|
if (ex == 0) continue;
|
||||||
tmp->set(idx, parms_[idx]->elaborate_expr(des, path));
|
tmp->set(idx, parms_[idx]->elaborate_expr(des, path));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2585,6 +2600,9 @@ Design* elaborate(const map<string,Module*>&modules,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: elaborate.cc,v $
|
* $Log: elaborate.cc,v $
|
||||||
|
* Revision 1.88 1999/09/16 04:18:15 steve
|
||||||
|
* elaborate concatenation repeats.
|
||||||
|
*
|
||||||
* Revision 1.87 1999/09/16 00:33:45 steve
|
* Revision 1.87 1999/09/16 00:33:45 steve
|
||||||
* Handle implicit !=0 in if statements.
|
* Handle implicit !=0 in if statements.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
11
eval.cc
11
eval.cc
|
|
@ -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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: eval.cc,v 1.5 1999/08/06 04:05:28 steve Exp $"
|
#ident "$Id: eval.cc,v 1.6 1999/09/16 04:18:15 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "PExpr.h"
|
# include "PExpr.h"
|
||||||
|
|
@ -60,7 +60,11 @@ verinum* PEIdent::eval_const(const Design*des, const string&path) const
|
||||||
{
|
{
|
||||||
assert(msb_ == 0);
|
assert(msb_ == 0);
|
||||||
const NetExpr*expr = des->find_parameter(path, text_);
|
const NetExpr*expr = des->find_parameter(path, text_);
|
||||||
if (expr == 0) return 0;
|
if (expr == 0) {
|
||||||
|
cerr << get_line() << ": unable to evaluate " << text_ <<
|
||||||
|
" in this context (" << path << ")." << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
const NetEConst*eval = dynamic_cast<const NetEConst*>(expr);
|
const NetEConst*eval = dynamic_cast<const NetEConst*>(expr);
|
||||||
assert(eval);
|
assert(eval);
|
||||||
return new verinum(eval->value());
|
return new verinum(eval->value());
|
||||||
|
|
@ -79,6 +83,9 @@ verinum* PETernary::eval_const(const Design*, const string&) const
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: eval.cc,v $
|
* $Log: eval.cc,v $
|
||||||
|
* Revision 1.6 1999/09/16 04:18:15 steve
|
||||||
|
* elaborate concatenation repeats.
|
||||||
|
*
|
||||||
* Revision 1.5 1999/08/06 04:05:28 steve
|
* Revision 1.5 1999/08/06 04:05:28 steve
|
||||||
* Handle scope of parameters.
|
* Handle scope of parameters.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
52
netlist.cc
52
netlist.cc
|
|
@ -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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: netlist.cc,v 1.63 1999/09/16 00:33:45 steve Exp $"
|
#ident "$Id: netlist.cc,v 1.64 1999/09/16 04:18:15 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <cassert>
|
# include <cassert>
|
||||||
|
|
@ -749,6 +749,22 @@ NetExpr* NetExpr::eval_tree()
|
||||||
NetEBAdd::NetEBAdd(char op, NetExpr*l, NetExpr*r)
|
NetEBAdd::NetEBAdd(char op, NetExpr*l, NetExpr*r)
|
||||||
: NetEBinary(op, l, r)
|
: NetEBinary(op, l, r)
|
||||||
{
|
{
|
||||||
|
if (l->expr_width() > r->expr_width())
|
||||||
|
r->set_width(l->expr_width());
|
||||||
|
|
||||||
|
if (r->expr_width() > l->expr_width())
|
||||||
|
l->set_width(r->expr_width());
|
||||||
|
|
||||||
|
if (l->expr_width() < r->expr_width())
|
||||||
|
r->set_width(l->expr_width());
|
||||||
|
|
||||||
|
if (r->expr_width() < l->expr_width())
|
||||||
|
l->set_width(r->expr_width());
|
||||||
|
|
||||||
|
if (r->expr_width() != l->expr_width())
|
||||||
|
expr_width(0);
|
||||||
|
else
|
||||||
|
expr_width(l->expr_width());
|
||||||
}
|
}
|
||||||
|
|
||||||
NetEBAdd::~NetEBAdd()
|
NetEBAdd::~NetEBAdd()
|
||||||
|
|
@ -834,8 +850,6 @@ NetEBinary::NetEBinary(char op, NetExpr*l, NetExpr*r)
|
||||||
: op_(op), left_(l), right_(r)
|
: op_(op), left_(l), right_(r)
|
||||||
{
|
{
|
||||||
switch (op_) {
|
switch (op_) {
|
||||||
case '+':
|
|
||||||
case '-':
|
|
||||||
case '^':
|
case '^':
|
||||||
case '&':
|
case '&':
|
||||||
case '|':
|
case '|':
|
||||||
|
|
@ -950,8 +964,8 @@ NetExpr* NetEBinary::eval_tree()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NetEConcat::NetEConcat(unsigned cnt)
|
NetEConcat::NetEConcat(unsigned cnt, unsigned r)
|
||||||
: parms_(cnt)
|
: parms_(cnt), repeat_(r)
|
||||||
{
|
{
|
||||||
expr_width(0);
|
expr_width(0);
|
||||||
}
|
}
|
||||||
|
|
@ -970,12 +984,24 @@ void NetEConcat::set(unsigned idx, NetExpr*e)
|
||||||
expr_width( expr_width() + e->expr_width() );
|
expr_width( expr_width() + e->expr_width() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add up the widths from all the expressions that are concatenated
|
||||||
|
* together. This is the width of the expression, tough luck if you
|
||||||
|
* want it otherwise.
|
||||||
|
*
|
||||||
|
* If during the course of elaboration one of the sub-expressions is
|
||||||
|
* broken, then don't count it in the width. This doesn't really
|
||||||
|
* matter because the null expression is indication of an error and
|
||||||
|
* the compiler will not go beyond elaboration.
|
||||||
|
*/
|
||||||
bool NetEConcat::set_width(unsigned w)
|
bool NetEConcat::set_width(unsigned w)
|
||||||
{
|
{
|
||||||
unsigned sum = 0;
|
unsigned sum = 0;
|
||||||
for (unsigned idx = 0 ; idx < parms_.count() ; idx += 1)
|
for (unsigned idx = 0 ; idx < parms_.count() ; idx += 1)
|
||||||
sum += parms_[idx]->expr_width();
|
if (parms_[idx] != 0)
|
||||||
|
sum += parms_[idx]->expr_width();
|
||||||
|
|
||||||
|
sum *= repeat_;
|
||||||
expr_width(sum);
|
expr_width(sum);
|
||||||
if (sum != w) return false;
|
if (sum != w) return false;
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -983,7 +1009,16 @@ bool NetEConcat::set_width(unsigned w)
|
||||||
|
|
||||||
NetEConcat* NetEConcat::dup_expr() const
|
NetEConcat* NetEConcat::dup_expr() const
|
||||||
{
|
{
|
||||||
assert(0);
|
NetEConcat*dup = new NetEConcat(parms_.count());
|
||||||
|
for (unsigned idx = 0 ; idx < parms_.count() ; idx += 1)
|
||||||
|
if (parms_[idx]) {
|
||||||
|
assert(parms_[idx]->dup_expr());
|
||||||
|
dup->parms_[idx] = parms_[idx]->dup_expr();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
dup->expr_width(expr_width());
|
||||||
|
return dup;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetEConst::~NetEConst()
|
NetEConst::~NetEConst()
|
||||||
|
|
@ -1801,6 +1836,9 @@ NetNet* Design::find_signal(bool (*func)(const NetNet*))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: netlist.cc,v $
|
* $Log: netlist.cc,v $
|
||||||
|
* Revision 1.64 1999/09/16 04:18:15 steve
|
||||||
|
* elaborate concatenation repeats.
|
||||||
|
*
|
||||||
* Revision 1.63 1999/09/16 00:33:45 steve
|
* Revision 1.63 1999/09/16 00:33:45 steve
|
||||||
* Handle implicit !=0 in if statements.
|
* Handle implicit !=0 in if statements.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: netlist.h,v 1.64 1999/09/15 01:55:06 steve Exp $"
|
#ident "$Id: netlist.h,v 1.65 1999/09/16 04:18:15 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1236,12 +1236,13 @@ class NetEBComp : public NetEBinary {
|
||||||
class NetEConcat : public NetExpr {
|
class NetEConcat : public NetExpr {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NetEConcat(unsigned cnt);
|
NetEConcat(unsigned cnt, unsigned repeat =1);
|
||||||
~NetEConcat();
|
~NetEConcat();
|
||||||
|
|
||||||
// Manipulate the parameters.
|
// Manipulate the parameters.
|
||||||
void set(unsigned idx, NetExpr*e);
|
void set(unsigned idx, NetExpr*e);
|
||||||
|
|
||||||
|
unsigned repeat() const { return repeat_; }
|
||||||
unsigned nparms() const { return parms_.count() ; }
|
unsigned nparms() const { return parms_.count() ; }
|
||||||
NetExpr* parm(unsigned idx) const { return parms_[idx]; }
|
NetExpr* parm(unsigned idx) const { return parms_[idx]; }
|
||||||
|
|
||||||
|
|
@ -1252,6 +1253,7 @@ class NetEConcat : public NetExpr {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
svector<NetExpr*>parms_;
|
svector<NetExpr*>parms_;
|
||||||
|
unsigned repeat_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class NetEConst : public NetExpr {
|
class NetEConst : public NetExpr {
|
||||||
|
|
@ -1582,6 +1584,9 @@ extern ostream& operator << (ostream&, NetNet::Type);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: netlist.h,v $
|
* $Log: netlist.h,v $
|
||||||
|
* Revision 1.65 1999/09/16 04:18:15 steve
|
||||||
|
* elaborate concatenation repeats.
|
||||||
|
*
|
||||||
* Revision 1.64 1999/09/15 01:55:06 steve
|
* Revision 1.64 1999/09/15 01:55:06 steve
|
||||||
* Elaborate non-blocking assignment to memories.
|
* Elaborate non-blocking assignment to memories.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
6
t-vvm.cc
6
t-vvm.cc
|
|
@ -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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: t-vvm.cc,v 1.41 1999/09/11 04:43:17 steve Exp $"
|
#ident "$Id: t-vvm.cc,v 1.42 1999/09/16 04:18:15 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <iostream>
|
# include <iostream>
|
||||||
|
|
@ -129,6 +129,7 @@ class vvm_proc_rval : public expr_scan_t {
|
||||||
|
|
||||||
void vvm_proc_rval::expr_concat(const NetEConcat*expr)
|
void vvm_proc_rval::expr_concat(const NetEConcat*expr)
|
||||||
{
|
{
|
||||||
|
assert(expr->repeat() == 1);
|
||||||
string tname = make_temp();
|
string tname = make_temp();
|
||||||
os_ << setw(indent_) << "" << "vvm_bitset_t<" <<
|
os_ << setw(indent_) << "" << "vvm_bitset_t<" <<
|
||||||
expr->expr_width() << "> " << tname << ";" << endl;
|
expr->expr_width() << "> " << tname << ";" << endl;
|
||||||
|
|
@ -1441,6 +1442,9 @@ extern const struct target tgt_vvm = {
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
* $Log: t-vvm.cc,v $
|
* $Log: t-vvm.cc,v $
|
||||||
|
* Revision 1.42 1999/09/16 04:18:15 steve
|
||||||
|
* elaborate concatenation repeats.
|
||||||
|
*
|
||||||
* Revision 1.41 1999/09/11 04:43:17 steve
|
* Revision 1.41 1999/09/11 04:43:17 steve
|
||||||
* Support ternary and <= operators in vvm.
|
* Support ternary and <= operators in vvm.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue