Support more parameter syntax.
This commit is contained in:
parent
5b3ba8c306
commit
f4a44df2cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: elab_scope.cc,v 1.36 2005/07/11 16:56:50 steve Exp $"
|
||||
#ident "$Id: elab_scope.cc,v 1.37 2006/03/18 22:53:38 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
|
|
@ -74,8 +74,7 @@ bool Module::elaborate_scope(Design*des, NetScope*scope) const
|
|||
|
||||
NetEParam*tmp = new NetEParam;
|
||||
tmp->set_line(*((*cur).second.expr));
|
||||
if ((*cur).second.msb)
|
||||
tmp->cast_signed( (*cur).second.signed_flag );
|
||||
tmp->cast_signed( (*cur).second.signed_flag );
|
||||
|
||||
scope->set_parameter((*cur).first, tmp, 0, 0, false);
|
||||
}
|
||||
|
|
@ -106,7 +105,7 @@ bool Module::elaborate_scope(Design*des, NetScope*scope) const
|
|||
NetExpr*val = ex->elaborate_pexpr(des, scope);
|
||||
NetExpr*msb = 0;
|
||||
NetExpr*lsb = 0;
|
||||
bool signed_flag = false;
|
||||
bool signed_flag = (*cur).second.signed_flag;
|
||||
|
||||
/* If the parameter declaration includes msb and lsb,
|
||||
then use them to calculate a width for the
|
||||
|
|
@ -117,10 +116,21 @@ bool Module::elaborate_scope(Design*des, NetScope*scope) const
|
|||
msb = (*cur).second.msb ->elaborate_pexpr(des, scope);
|
||||
assert(msb);
|
||||
lsb = (*cur).second.lsb ->elaborate_pexpr(des, scope);
|
||||
signed_flag = (*cur).second.signed_flag;
|
||||
}
|
||||
|
||||
val->cast_signed(signed_flag);
|
||||
if (signed_flag) {
|
||||
/* If explicitly signed, then say so. */
|
||||
val->cast_signed(true);
|
||||
} else if ((*cur).second.msb) {
|
||||
/* If there is a range, then the signedness comes
|
||||
from the type and not the expression. */
|
||||
val->cast_signed(signed_flag);
|
||||
} else {
|
||||
/* otherwise, let the expression describe
|
||||
itself. */
|
||||
signed_flag = val->has_sign();
|
||||
}
|
||||
|
||||
val = scope->set_parameter((*cur).first, val,
|
||||
msb, lsb, signed_flag);
|
||||
assert(val);
|
||||
|
|
@ -600,6 +610,9 @@ void PWhile::elaborate_scope(Design*des, NetScope*scope) const
|
|||
|
||||
/*
|
||||
* $Log: elab_scope.cc,v $
|
||||
* Revision 1.37 2006/03/18 22:53:38 steve
|
||||
* Support more parameter syntax.
|
||||
*
|
||||
* Revision 1.36 2005/07/11 16:56:50 steve
|
||||
* Remove NetVariable and ivl_variable_t structures.
|
||||
*
|
||||
|
|
|
|||
49
parse.y
49
parse.y
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: parse.y,v 1.209 2006/02/02 02:43:59 steve Exp $"
|
||||
#ident "$Id: parse.y,v 1.210 2006/03/18 22:53:38 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
|
|
@ -1898,6 +1898,33 @@ var_type
|
|||
: K_reg { $$ = NetNet::REG; }
|
||||
;
|
||||
|
||||
/* In this rule we have matched the "parameter" keyword. The rule
|
||||
generates a type (optional) and a list of assignments. */
|
||||
|
||||
parameter_assign_decl
|
||||
: parameter_assign_list
|
||||
| range { active_range = $1; active_signed = false; }
|
||||
parameter_assign_list
|
||||
{ active_range = 0;
|
||||
active_signed = false;
|
||||
}
|
||||
| K_signed range { active_range = $2; active_signed = true; }
|
||||
parameter_assign_list
|
||||
{ active_range = 0;
|
||||
active_signed = false;
|
||||
}
|
||||
| K_integer { active_range = 0; active_signed = true; }
|
||||
parameter_assign_list
|
||||
{ active_range = 0;
|
||||
active_signed = false;
|
||||
}
|
||||
;
|
||||
|
||||
parameter_assign_list
|
||||
: parameter_assign
|
||||
| parameter_assign_list ',' parameter_assign
|
||||
;
|
||||
|
||||
parameter_assign
|
||||
: IDENTIFIER '=' expression
|
||||
{ PExpr*tmp = $3;
|
||||
|
|
@ -1915,26 +1942,6 @@ parameter_assign
|
|||
}
|
||||
;
|
||||
|
||||
parameter_assign_decl
|
||||
: parameter_assign_list
|
||||
| range { active_range = $1; active_signed = false; }
|
||||
parameter_assign_list
|
||||
{ active_range = 0;
|
||||
active_signed = false;
|
||||
}
|
||||
| K_signed range { active_range = $2; active_signed = true; }
|
||||
parameter_assign_list
|
||||
{ active_range = 0;
|
||||
active_signed = false;
|
||||
}
|
||||
;
|
||||
|
||||
parameter_assign_list
|
||||
: parameter_assign
|
||||
| parameter_assign_list ',' parameter_assign
|
||||
;
|
||||
|
||||
|
||||
/* Localparam assignments and assignment lists are broken into
|
||||
separate BNF so that I can call slightly different parameter
|
||||
handling code. They parse the same as parameters, they just
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: vvp_scope.c,v 1.141 2006/03/15 05:52:20 steve Exp $"
|
||||
#ident "$Id: vvp_scope.c,v 1.142 2006/03/18 22:53:38 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "vvp_priv.h"
|
||||
|
|
@ -2133,8 +2133,9 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent)
|
|||
ivl_expr_string(pex));
|
||||
break;
|
||||
case IVL_EX_NUMBER:
|
||||
fprintf(vvp_out, "P_%p .param/l \"%s\", C4<",
|
||||
par, ivl_parameter_basename(par));
|
||||
fprintf(vvp_out, "P_%p .param/l \"%s\", %sC4<",
|
||||
par, ivl_parameter_basename(par),
|
||||
ivl_expr_signed(pex)? "+":"");
|
||||
{ const char*bits = ivl_expr_bits(pex);
|
||||
unsigned nbits = ivl_expr_width(pex);
|
||||
unsigned bb;
|
||||
|
|
@ -2203,6 +2204,9 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent)
|
|||
|
||||
/*
|
||||
* $Log: vvp_scope.c,v $
|
||||
* Revision 1.142 2006/03/18 22:53:38 steve
|
||||
* Support more parameter syntax.
|
||||
*
|
||||
* Revision 1.141 2006/03/15 05:52:20 steve
|
||||
* Handle multiple part/bi devices connected together.
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue