Handle bit select of parameter with ranges.
This commit is contained in:
parent
bab70ccbed
commit
908955c72c
9
PExpr.h
9
PExpr.h
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: PExpr.h,v 1.72 2005/11/10 13:28:11 steve Exp $"
|
#ident "$Id: PExpr.h,v 1.73 2005/11/27 05:56:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <string>
|
# include <string>
|
||||||
|
|
@ -255,7 +255,9 @@ class PEIdent : public PExpr {
|
||||||
NetExpr*elaborate_expr_param(Design*des,
|
NetExpr*elaborate_expr_param(Design*des,
|
||||||
NetScope*scope,
|
NetScope*scope,
|
||||||
const NetExpr*par,
|
const NetExpr*par,
|
||||||
NetScope*found) const;
|
NetScope*found,
|
||||||
|
const NetExpr*par_msb,
|
||||||
|
const NetExpr*par_lsb) const;
|
||||||
NetExpr*elaborate_expr_net(Design*des,
|
NetExpr*elaborate_expr_net(Design*des,
|
||||||
NetScope*scope,
|
NetScope*scope,
|
||||||
NetNet*net,
|
NetNet*net,
|
||||||
|
|
@ -543,6 +545,9 @@ class PECallFunction : public PExpr {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: PExpr.h,v $
|
* $Log: PExpr.h,v $
|
||||||
|
* Revision 1.73 2005/11/27 05:56:20 steve
|
||||||
|
* Handle bit select of parameter with ranges.
|
||||||
|
*
|
||||||
* Revision 1.72 2005/11/10 13:28:11 steve
|
* Revision 1.72 2005/11/10 13:28:11 steve
|
||||||
* Reorganize signal part select handling, and add support for
|
* Reorganize signal part select handling, and add support for
|
||||||
* indexed part selects.
|
* indexed part selects.
|
||||||
|
|
|
||||||
55
elab_expr.cc
55
elab_expr.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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: elab_expr.cc,v 1.100 2005/11/14 22:11:52 steve Exp $"
|
#ident "$Id: elab_expr.cc,v 1.101 2005/11/27 05:56:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -493,13 +493,16 @@ NetExpr* PEIdent::elaborate_expr(Design*des, NetScope*scope,
|
||||||
const NetExpr*par = 0;
|
const NetExpr*par = 0;
|
||||||
NetEvent* eve = 0;
|
NetEvent* eve = 0;
|
||||||
|
|
||||||
|
const NetExpr*ex1, *ex2;
|
||||||
|
|
||||||
NetScope*found_in = symbol_search(des, scope, path_,
|
NetScope*found_in = symbol_search(des, scope, path_,
|
||||||
net, mem, par, eve);
|
net, mem, par, eve,
|
||||||
|
ex1, ex2);
|
||||||
|
|
||||||
// If the identifier name is a parameter name, then return
|
// If the identifier name is a parameter name, then return
|
||||||
// a reference to the parameter expression.
|
// a reference to the parameter expression.
|
||||||
if (par != 0)
|
if (par != 0)
|
||||||
return elaborate_expr_param(des, scope, par, found_in);
|
return elaborate_expr_param(des, scope, par, found_in, ex1, ex2);
|
||||||
|
|
||||||
|
|
||||||
// If the identifier names a signal (a register or wire)
|
// If the identifier names a signal (a register or wire)
|
||||||
|
|
@ -592,10 +595,17 @@ NetExpr* PEIdent::elaborate_expr(Design*des, NetScope*scope,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle the case that the identifier is a parameter reference. The
|
||||||
|
* parameter expression has already been located for us (as the par
|
||||||
|
* argument) so we just need to process the sub-expression.
|
||||||
|
*/
|
||||||
NetExpr* PEIdent::elaborate_expr_param(Design*des,
|
NetExpr* PEIdent::elaborate_expr_param(Design*des,
|
||||||
NetScope*scope,
|
NetScope*scope,
|
||||||
const NetExpr*par,
|
const NetExpr*par,
|
||||||
NetScope*found_in) const
|
NetScope*found_in,
|
||||||
|
const NetExpr*par_msb,
|
||||||
|
const NetExpr*par_lsb) const
|
||||||
{
|
{
|
||||||
NetExpr*tmp;
|
NetExpr*tmp;
|
||||||
|
|
||||||
|
|
@ -604,7 +614,7 @@ NetExpr* PEIdent::elaborate_expr_param(Design*des,
|
||||||
if (sel_ == SEL_PART) {
|
if (sel_ == SEL_PART) {
|
||||||
assert(msb_ && lsb_);
|
assert(msb_ && lsb_);
|
||||||
|
|
||||||
/* If the parameter has a part select, we support
|
/* If the identifier has a part select, we support
|
||||||
it by pulling the right bits out and making a
|
it by pulling the right bits out and making a
|
||||||
sized unsigned constant. This code assumes the
|
sized unsigned constant. This code assumes the
|
||||||
lsb of a parameter is 0 and the msb is the
|
lsb of a parameter is 0 and the msb is the
|
||||||
|
|
@ -700,7 +710,10 @@ NetExpr* PEIdent::elaborate_expr_param(Design*des,
|
||||||
tmp = new NetESelect(tmp, idx_ex, wid);
|
tmp = new NetESelect(tmp, idx_ex, wid);
|
||||||
|
|
||||||
|
|
||||||
} else if (msb_) {
|
} else if (sel_ == SEL_BIT) {
|
||||||
|
assert(msb_);
|
||||||
|
assert(!lsb_);
|
||||||
|
|
||||||
/* Handle the case where a parameter has a bit
|
/* Handle the case where a parameter has a bit
|
||||||
select attached to it. Generate a NetESelect
|
select attached to it. Generate a NetESelect
|
||||||
object to select the bit as desired. */
|
object to select the bit as desired. */
|
||||||
|
|
@ -722,6 +735,8 @@ NetExpr* PEIdent::elaborate_expr_param(Design*des,
|
||||||
NetEConst*re = dynamic_cast<NetEConst*>(mtmp);
|
NetEConst*re = dynamic_cast<NetEConst*>(mtmp);
|
||||||
if (le && re) {
|
if (le && re) {
|
||||||
|
|
||||||
|
/* Argument and bit select are constant. Calculate
|
||||||
|
the final result. */
|
||||||
verinum lv = le->value();
|
verinum lv = le->value();
|
||||||
verinum rv = re->value();
|
verinum rv = re->value();
|
||||||
verinum::V rb = verinum::Vx;
|
verinum::V rb = verinum::Vx;
|
||||||
|
|
@ -744,6 +759,31 @@ NetExpr* PEIdent::elaborate_expr_param(Design*des,
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
const NetEConst*par_me =dynamic_cast<const NetEConst*>(par_msb);
|
||||||
|
const NetEConst*par_le =dynamic_cast<const NetEConst*>(par_lsb);
|
||||||
|
|
||||||
|
assert(par_me || !par_msb);
|
||||||
|
assert(par_le || !par_lsb);
|
||||||
|
assert(par_me || !par_le);
|
||||||
|
|
||||||
|
if (par_me) {
|
||||||
|
long par_mv = par_me->value().as_long();
|
||||||
|
long par_lv = par_le->value().as_long();
|
||||||
|
if (par_mv >= par_lv) {
|
||||||
|
mtmp = par_lv
|
||||||
|
? make_add_expr(mtmp, 0-par_lv)
|
||||||
|
: mtmp;
|
||||||
|
} else {
|
||||||
|
if (par_lv != 0)
|
||||||
|
mtmp = make_add_expr(mtmp, 0-par_mv);
|
||||||
|
mtmp = make_sub_expr(par_lv-par_mv, mtmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The value is constant, but the bit select
|
||||||
|
expression is not. Elaborate a NetESelect to
|
||||||
|
evaluate the select at run-time. */
|
||||||
|
|
||||||
NetESelect*stmp = new NetESelect(tmp, mtmp, 1);
|
NetESelect*stmp = new NetESelect(tmp, mtmp, 1);
|
||||||
tmp->set_line(*this);
|
tmp->set_line(*this);
|
||||||
tmp = stmp;
|
tmp = stmp;
|
||||||
|
|
@ -1228,6 +1268,9 @@ NetExpr* PEUnary::elaborate_expr(Design*des, NetScope*scope, bool) const
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: elab_expr.cc,v $
|
* $Log: elab_expr.cc,v $
|
||||||
|
* Revision 1.101 2005/11/27 05:56:20 steve
|
||||||
|
* Handle bit select of parameter with ranges.
|
||||||
|
*
|
||||||
* Revision 1.100 2005/11/14 22:11:52 steve
|
* Revision 1.100 2005/11/14 22:11:52 steve
|
||||||
* Fix compile warning.
|
* Fix compile warning.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: elab_pexpr.cc,v 1.21 2004/02/20 06:22:56 steve Exp $"
|
#ident "$Id: elab_pexpr.cc,v 1.22 2005/11/27 05:56:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -140,7 +140,9 @@ NetExpr*PEIdent::elaborate_pexpr(Design*des, NetScope*scope) const
|
||||||
perm_string perm_name = lex_strings.make(name);
|
perm_string perm_name = lex_strings.make(name);
|
||||||
delete name;
|
delete name;
|
||||||
|
|
||||||
const NetExpr*ex = pscope->get_parameter(perm_name);
|
const NetExpr*ex_msb;
|
||||||
|
const NetExpr*ex_lsb;
|
||||||
|
const NetExpr*ex = pscope->get_parameter(perm_name, ex_msb, ex_lsb);
|
||||||
if (ex == 0) {
|
if (ex == 0) {
|
||||||
cerr << get_line() << ": error: identifier ``" << path_ <<
|
cerr << get_line() << ": error: identifier ``" << path_ <<
|
||||||
"'' is not a parameter in " << scope->name() << "." << endl;
|
"'' is not a parameter in " << scope->name() << "." << endl;
|
||||||
|
|
@ -231,6 +233,9 @@ NetExpr*PEUnary::elaborate_pexpr (Design*des, NetScope*scope) const
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: elab_pexpr.cc,v $
|
* $Log: elab_pexpr.cc,v $
|
||||||
|
* Revision 1.22 2005/11/27 05:56:20 steve
|
||||||
|
* Handle bit select of parameter with ranges.
|
||||||
|
*
|
||||||
* Revision 1.21 2004/02/20 06:22:56 steve
|
* Revision 1.21 2004/02/20 06:22:56 steve
|
||||||
* parameter keys are per_strings.
|
* parameter keys are per_strings.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
14
eval.cc
14
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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: eval.cc,v 1.36 2003/06/21 01:21:43 steve Exp $"
|
#ident "$Id: eval.cc,v 1.37 2005/11/27 05:56:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
# include "PExpr.h"
|
# include "PExpr.h"
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
# include "netmisc.h"
|
||||||
# include "compiler.h"
|
# include "compiler.h"
|
||||||
|
|
||||||
verinum* PExpr::eval_const(const Design*, const NetScope*) const
|
verinum* PExpr::eval_const(const Design*, const NetScope*) const
|
||||||
|
|
@ -151,7 +152,13 @@ verinum* PEBinary::eval_const(const Design*des, const NetScope*scope) const
|
||||||
verinum* PEIdent::eval_const(const Design*des, const NetScope*scope) const
|
verinum* PEIdent::eval_const(const Design*des, const NetScope*scope) const
|
||||||
{
|
{
|
||||||
assert(scope);
|
assert(scope);
|
||||||
const NetExpr*expr = des->find_parameter(scope, path_);
|
//const NetExpr*expr = des->find_parameter(scope, path_);
|
||||||
|
NetNet*net;
|
||||||
|
NetMemory*mem;
|
||||||
|
NetEvent*eve;
|
||||||
|
const NetExpr*expr;
|
||||||
|
NetScope*found_in = symbol_search(des, scope, path_,
|
||||||
|
net, mem, expr, eve);
|
||||||
|
|
||||||
if (expr == 0)
|
if (expr == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -240,6 +247,9 @@ verinum* PEUnary::eval_const(const Design*des, const NetScope*scope) const
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: eval.cc,v $
|
* $Log: eval.cc,v $
|
||||||
|
* Revision 1.37 2005/11/27 05:56:20 steve
|
||||||
|
* Handle bit select of parameter with ranges.
|
||||||
|
*
|
||||||
* Revision 1.36 2003/06/21 01:21:43 steve
|
* Revision 1.36 2003/06/21 01:21:43 steve
|
||||||
* Harmless fixup of warnings.
|
* Harmless fixup of warnings.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: eval_tree.cc,v 1.66 2005/11/10 13:28:12 steve Exp $"
|
#ident "$Id: eval_tree.cc,v 1.67 2005/11/27 05:56:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -1171,7 +1171,9 @@ NetExpr* NetEParam::eval_tree()
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
assert(scope_);
|
assert(scope_);
|
||||||
const NetExpr*expr = scope_->get_parameter(name_);
|
const NetExpr*expr_msb;
|
||||||
|
const NetExpr*expr_lsb;
|
||||||
|
const NetExpr*expr = scope_->get_parameter(name_, expr_msb, expr_lsb);
|
||||||
if (expr == 0) {
|
if (expr == 0) {
|
||||||
cerr << get_line() << ": internal error: Unable to match "
|
cerr << get_line() << ": internal error: Unable to match "
|
||||||
<< "parameter " << name_ << " in scope "
|
<< "parameter " << name_ << " in scope "
|
||||||
|
|
@ -1599,6 +1601,9 @@ NetEConst* NetEUReduce::eval_tree()
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: eval_tree.cc,v $
|
* $Log: eval_tree.cc,v $
|
||||||
|
* Revision 1.67 2005/11/27 05:56:20 steve
|
||||||
|
* Handle bit select of parameter with ranges.
|
||||||
|
*
|
||||||
* Revision 1.66 2005/11/10 13:28:12 steve
|
* Revision 1.66 2005/11/10 13:28:12 steve
|
||||||
* Reorganize signal part select handling, and add support for
|
* Reorganize signal part select handling, and add support for
|
||||||
* indexed part selects.
|
* indexed part selects.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: net_design.cc,v 1.47 2005/09/14 02:53:14 steve Exp $"
|
#ident "$Id: net_design.cc,v 1.48 2005/11/27 05:56:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -173,71 +173,6 @@ NetScope* Design::find_scope(NetScope*scope, const hname_t&path) const
|
||||||
return find_scope(path);
|
return find_scope(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Find a parameter from within a specified context. If the name is
|
|
||||||
* not here, keep looking up until I run out of up to look at. The
|
|
||||||
* method works by scanning scopes, starting with the passed scope and
|
|
||||||
* working up towards the root, looking for the named parameter. The
|
|
||||||
* name in this case can be hierarchical, so there is an inner loop to
|
|
||||||
* follow the scopes of the name down to to key.
|
|
||||||
*
|
|
||||||
* The expression value of the parameter is returned as the result,
|
|
||||||
* and the scope that contains the parameter is returned in the out
|
|
||||||
* argument found_in.
|
|
||||||
*/
|
|
||||||
const NetExpr* Design::find_parameter(NetScope*scope,
|
|
||||||
const hname_t&path,
|
|
||||||
NetScope*&found_in) const
|
|
||||||
{
|
|
||||||
for ( ; scope ; scope = scope->parent()) {
|
|
||||||
unsigned hidx = 0;
|
|
||||||
|
|
||||||
NetScope*cur = scope;
|
|
||||||
while (path.peek_name(hidx+1)) {
|
|
||||||
cur = cur->child(path.peek_name(hidx));
|
|
||||||
if (cur == 0)
|
|
||||||
break;
|
|
||||||
hidx += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cur == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (const NetExpr*res = cur->get_parameter(path.peek_name(hidx))) {
|
|
||||||
found_in = cur;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const NetExpr* Design::find_parameter(const NetScope*scope,
|
|
||||||
const hname_t&path) const
|
|
||||||
{
|
|
||||||
for ( ; scope ; scope = scope->parent()) {
|
|
||||||
unsigned hidx = 0;
|
|
||||||
|
|
||||||
const NetScope*cur = scope;
|
|
||||||
while (path.peek_name(hidx+1)) {
|
|
||||||
cur = cur->child(path.peek_name(hidx));
|
|
||||||
if (cur == 0)
|
|
||||||
break;
|
|
||||||
hidx += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cur == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (const NetExpr*res = cur->get_parameter(path.peek_name(hidx)))
|
|
||||||
return res;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This method runs through the scope, noticing the defparam
|
* This method runs through the scope, noticing the defparam
|
||||||
* statements that were collected during the elaborate_scope pass and
|
* statements that were collected during the elaborate_scope pass and
|
||||||
|
|
@ -619,6 +554,9 @@ void Design::delete_process(NetProcTop*top)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: net_design.cc,v $
|
* $Log: net_design.cc,v $
|
||||||
|
* Revision 1.48 2005/11/27 05:56:20 steve
|
||||||
|
* Handle bit select of parameter with ranges.
|
||||||
|
*
|
||||||
* Revision 1.47 2005/09/14 02:53:14 steve
|
* Revision 1.47 2005/09/14 02:53:14 steve
|
||||||
* Support bool expressions and compares handle them optimally.
|
* Support bool expressions and compares handle them optimally.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
19
net_scope.cc
19
net_scope.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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: net_scope.cc,v 1.34 2005/07/11 16:56:50 steve Exp $"
|
#ident "$Id: net_scope.cc,v 1.35 2005/11/27 05:56:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -132,17 +132,25 @@ NetExpr* NetScope::set_localparam(perm_string key, NetExpr*expr)
|
||||||
* perm_string::literal method to fake the compiler into doing the
|
* perm_string::literal method to fake the compiler into doing the
|
||||||
* compare without actually creating a perm_string.
|
* compare without actually creating a perm_string.
|
||||||
*/
|
*/
|
||||||
const NetExpr* NetScope::get_parameter(const char* key) const
|
const NetExpr* NetScope::get_parameter(const char* key,
|
||||||
|
const NetExpr*&msb,
|
||||||
|
const NetExpr*&lsb) const
|
||||||
{
|
{
|
||||||
map<perm_string,param_expr_t>::const_iterator idx;
|
map<perm_string,param_expr_t>::const_iterator idx;
|
||||||
|
|
||||||
idx = parameters.find(perm_string::literal(key));
|
idx = parameters.find(perm_string::literal(key));
|
||||||
if (idx != parameters.end())
|
if (idx != parameters.end()) {
|
||||||
|
msb = (*idx).second.msb;
|
||||||
|
lsb = (*idx).second.lsb;
|
||||||
return (*idx).second.expr;
|
return (*idx).second.expr;
|
||||||
|
}
|
||||||
|
|
||||||
idx = localparams.find(perm_string::literal(key));
|
idx = localparams.find(perm_string::literal(key));
|
||||||
if (idx != localparams.end())
|
if (idx != localparams.end()) {
|
||||||
|
msb = (*idx).second.msb;
|
||||||
|
lsb = (*idx).second.lsb;
|
||||||
return (*idx).second.expr;
|
return (*idx).second.expr;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -449,6 +457,9 @@ string NetScope::local_hsymbol()
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: net_scope.cc,v $
|
* $Log: net_scope.cc,v $
|
||||||
|
* Revision 1.35 2005/11/27 05:56:20 steve
|
||||||
|
* Handle bit select of parameter with ranges.
|
||||||
|
*
|
||||||
* Revision 1.34 2005/07/11 16:56:50 steve
|
* Revision 1.34 2005/07/11 16:56:50 steve
|
||||||
* Remove NetVariable and ivl_variable_t structures.
|
* Remove NetVariable and ivl_variable_t structures.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
20
netlist.h
20
netlist.h
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: netlist.h,v 1.352 2005/11/26 00:35:43 steve Exp $"
|
#ident "$Id: netlist.h,v 1.353 2005/11/27 05:56:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -3146,7 +3146,10 @@ class NetScope : public Attrib {
|
||||||
NetExpr* set_parameter(perm_string name, NetExpr*val,
|
NetExpr* set_parameter(perm_string name, NetExpr*val,
|
||||||
NetExpr*msb, NetExpr*lsb, bool signed_flag);
|
NetExpr*msb, NetExpr*lsb, bool signed_flag);
|
||||||
NetExpr* set_localparam(perm_string name, NetExpr*val);
|
NetExpr* set_localparam(perm_string name, NetExpr*val);
|
||||||
const NetExpr*get_parameter(const char* name) const;
|
|
||||||
|
const NetExpr*get_parameter(const char* name,
|
||||||
|
const NetExpr*&msb,
|
||||||
|
const NetExpr*&lsb) const;
|
||||||
|
|
||||||
/* These are used by defparam elaboration to replace the
|
/* These are used by defparam elaboration to replace the
|
||||||
expression with a new expression, without affecting the
|
expression with a new expression, without affecting the
|
||||||
|
|
@ -3344,16 +3347,6 @@ class Design {
|
||||||
|
|
||||||
// PARAMETERS
|
// PARAMETERS
|
||||||
|
|
||||||
/* This method searches for a parameter, starting in the given
|
|
||||||
scope. This method handles the upward searches that the
|
|
||||||
NetScope class itself does not support.
|
|
||||||
|
|
||||||
The scope of the located expression is stored in the
|
|
||||||
found_in argument. */
|
|
||||||
const NetExpr*find_parameter( NetScope*, const hname_t&path,
|
|
||||||
NetScope*&found_in) const;
|
|
||||||
const NetExpr*find_parameter( const NetScope*, const hname_t&path) const;
|
|
||||||
|
|
||||||
void run_defparams();
|
void run_defparams();
|
||||||
void evaluate_parameters();
|
void evaluate_parameters();
|
||||||
|
|
||||||
|
|
@ -3458,6 +3451,9 @@ extern ostream& operator << (ostream&, NetNet::Type);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: netlist.h,v $
|
* $Log: netlist.h,v $
|
||||||
|
* Revision 1.353 2005/11/27 05:56:20 steve
|
||||||
|
* Handle bit select of parameter with ranges.
|
||||||
|
*
|
||||||
* Revision 1.352 2005/11/26 00:35:43 steve
|
* Revision 1.352 2005/11/26 00:35:43 steve
|
||||||
* More precise about r-value width of constants.
|
* More precise about r-value width of constants.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
27
netmisc.h
27
netmisc.h
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: netmisc.h,v 1.23 2005/07/11 16:56:51 steve Exp $"
|
#ident "$Id: netmisc.h,v 1.24 2005/11/27 05:56:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
|
@ -33,12 +33,30 @@
|
||||||
* If the symbol was not found, return 0. The output arguments
|
* If the symbol was not found, return 0. The output arguments
|
||||||
* get 0 except for the pointer to the object that represents
|
* get 0 except for the pointer to the object that represents
|
||||||
* the located symbol.
|
* the located symbol.
|
||||||
|
*
|
||||||
|
* The ex1 and ex2 output arguments are extended results. If the
|
||||||
|
* symbol is a parameter (par!=0) then ex1 is the msb expression and
|
||||||
|
* ex2 is the lsb expression for the range. If there is no range, then
|
||||||
|
* these values are set to 0.
|
||||||
*/
|
*/
|
||||||
extern NetScope* symbol_search(Design*des, NetScope*start, hname_t path,
|
extern NetScope* symbol_search(const Design*des,
|
||||||
|
NetScope*start, hname_t path,
|
||||||
NetNet*&net, /* net/reg */
|
NetNet*&net, /* net/reg */
|
||||||
NetMemory*&mem, /* memory */
|
NetMemory*&mem, /* memory */
|
||||||
const NetExpr*&par,/* parameter */
|
const NetExpr*&par,/* parameter */
|
||||||
NetEvent*&eve /* named event */);
|
NetEvent*&eve, /* named event */
|
||||||
|
const NetExpr*&ex1, const NetExpr*&ex2);
|
||||||
|
|
||||||
|
inline NetScope* symbol_search(const Design*des,
|
||||||
|
NetScope*start, const hname_t&path,
|
||||||
|
NetNet*&net, /* net/reg */
|
||||||
|
NetMemory*&mem, /* memory */
|
||||||
|
const NetExpr*&par,/* parameter */
|
||||||
|
NetEvent*&eve /* named event */)
|
||||||
|
{
|
||||||
|
const NetExpr*ex1, *ex2;
|
||||||
|
return symbol_search(des, start, path, net, mem, par, eve, ex1, ex2);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function transforms an expression by padding the high bits
|
* This function transforms an expression by padding the high bits
|
||||||
|
|
@ -100,6 +118,9 @@ extern NetExpr* elab_and_eval(Design*des, NetScope*scope, const PExpr*pe);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: netmisc.h,v $
|
* $Log: netmisc.h,v $
|
||||||
|
* Revision 1.24 2005/11/27 05:56:20 steve
|
||||||
|
* Handle bit select of parameter with ranges.
|
||||||
|
*
|
||||||
* Revision 1.23 2005/07/11 16:56:51 steve
|
* Revision 1.23 2005/07/11 16:56:51 steve
|
||||||
* Remove NetVariable and ivl_variable_t structures.
|
* Remove NetVariable and ivl_variable_t structures.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: symbol_search.cc,v 1.2 2005/07/11 16:56:51 steve Exp $"
|
#ident "$Id: symbol_search.cc,v 1.3 2005/11/27 05:56:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
|
@ -27,11 +27,12 @@
|
||||||
/*
|
/*
|
||||||
* Search for the hierarchical name.
|
* Search for the hierarchical name.
|
||||||
*/
|
*/
|
||||||
NetScope*symbol_search(Design*des, NetScope*scope, hname_t path,
|
NetScope*symbol_search(const Design*des, NetScope*scope, hname_t path,
|
||||||
NetNet*&net,
|
NetNet*&net,
|
||||||
NetMemory*&mem,
|
NetMemory*&mem,
|
||||||
const NetExpr*&par,
|
const NetExpr*&par,
|
||||||
NetEvent*&eve)
|
NetEvent*&eve,
|
||||||
|
const NetExpr*&ex1, const NetExpr*&ex2)
|
||||||
{
|
{
|
||||||
assert(scope);
|
assert(scope);
|
||||||
|
|
||||||
|
|
@ -65,7 +66,7 @@ NetScope*symbol_search(Design*des, NetScope*scope, hname_t path,
|
||||||
return scope;
|
return scope;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (par = scope->get_parameter(key)) ) {
|
if ( (par = scope->get_parameter(key, ex1, ex2)) ) {
|
||||||
delete key;
|
delete key;
|
||||||
return scope;
|
return scope;
|
||||||
}
|
}
|
||||||
|
|
@ -82,6 +83,9 @@ NetScope*symbol_search(Design*des, NetScope*scope, hname_t path,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: symbol_search.cc,v $
|
* $Log: symbol_search.cc,v $
|
||||||
|
* Revision 1.3 2005/11/27 05:56:20 steve
|
||||||
|
* Handle bit select of parameter with ranges.
|
||||||
|
*
|
||||||
* Revision 1.2 2005/07/11 16:56:51 steve
|
* Revision 1.2 2005/07/11 16:56:51 steve
|
||||||
* Remove NetVariable and ivl_variable_t structures.
|
* Remove NetVariable and ivl_variable_t structures.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue