vlog95: emit an entire parameter reference by name instead of value.
This commit is contained in:
parent
d1c1997acf
commit
cbd1b948a2
|
|
@ -21,6 +21,10 @@
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
# include "vlog95_priv.h"
|
# include "vlog95_priv.h"
|
||||||
|
|
||||||
|
/* The expression code needs to know when a parameter definition is being
|
||||||
|
* emitted so it can print the numeric value instead of the parameter name. */
|
||||||
|
ivl_parameter_t emitting_param = 0;
|
||||||
|
|
||||||
// HERE: Do we need to use wid in these routines? We should probably use
|
// HERE: Do we need to use wid in these routines? We should probably use
|
||||||
// it to verify that the expressions have the expected width.
|
// it to verify that the expressions have the expected width.
|
||||||
|
|
||||||
|
|
@ -310,6 +314,47 @@ static void emit_expr_event(ivl_scope_t scope, ivl_expr_t expr, unsigned wid)
|
||||||
emit_id(ivl_event_basename(event));
|
emit_id(ivl_event_basename(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A number can also be a parameter reference. If it is a parameter
|
||||||
|
* reference then emit the appropriate parameter name instead of the
|
||||||
|
* numeric value unless this is the actual parameter definition.
|
||||||
|
*/
|
||||||
|
static void emit_expr_number(ivl_scope_t scope, ivl_expr_t expr, unsigned wid)
|
||||||
|
{
|
||||||
|
ivl_parameter_t param = ivl_expr_parameter(expr);
|
||||||
|
if (param && (param != emitting_param)) {
|
||||||
|
emit_scope_call_path(scope, ivl_parameter_scope(param));
|
||||||
|
emit_id(ivl_parameter_basename(param));
|
||||||
|
} else {
|
||||||
|
emit_number(ivl_expr_bits(expr), ivl_expr_width(expr),
|
||||||
|
ivl_expr_signed(expr), ivl_expr_file(expr),
|
||||||
|
ivl_expr_lineno(expr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emit_expr_real_number(ivl_scope_t scope, ivl_expr_t expr,
|
||||||
|
unsigned wid)
|
||||||
|
{
|
||||||
|
ivl_parameter_t param = ivl_expr_parameter(expr);
|
||||||
|
if (param && (param != emitting_param)) {
|
||||||
|
emit_scope_call_path(scope, ivl_parameter_scope(param));
|
||||||
|
emit_id(ivl_parameter_basename(param));
|
||||||
|
} else {
|
||||||
|
emit_real_number(ivl_expr_dvalue(expr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class properties are not supported in vlog95, but they can be translated.
|
||||||
|
*/
|
||||||
|
void emit_class_property(ivl_scope_t scope, ivl_expr_t expr, unsigned wid)
|
||||||
|
{
|
||||||
|
ivl_signal_t sig = ivl_expr_signal(expr);
|
||||||
|
emit_scope_call_path(scope, ivl_signal_scope(sig));
|
||||||
|
emit_id(ivl_signal_basename(sig));
|
||||||
|
fprintf(vlog_out, ".%s", ivl_expr_name(expr));
|
||||||
|
}
|
||||||
|
|
||||||
static void emit_expr_scope_piece(ivl_scope_t scope)
|
static void emit_expr_scope_piece(ivl_scope_t scope)
|
||||||
{
|
{
|
||||||
ivl_scope_t parent = ivl_scope_parent(scope);
|
ivl_scope_t parent = ivl_scope_parent(scope);
|
||||||
|
|
@ -782,17 +827,6 @@ static void emit_expr_unary(ivl_scope_t scope, ivl_expr_t expr, unsigned wid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Class properties are not supported in vlog95, but they can be translated.
|
|
||||||
*/
|
|
||||||
void emit_class_property(ivl_scope_t scope, ivl_expr_t expr, unsigned wid)
|
|
||||||
{
|
|
||||||
ivl_signal_t sig = ivl_expr_signal(expr);
|
|
||||||
emit_scope_call_path(scope, ivl_signal_scope(sig));
|
|
||||||
emit_id(ivl_signal_basename(sig));
|
|
||||||
fprintf(vlog_out, ".%s", ivl_expr_name(expr));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Data type used to signify if a $signed or $unsigned should be emitted.
|
* Data type used to signify if a $signed or $unsigned should be emitted.
|
||||||
*/
|
*/
|
||||||
|
|
@ -1049,15 +1083,13 @@ void emit_expr(ivl_scope_t scope, ivl_expr_t expr, unsigned wid,
|
||||||
vlog_errors += 1;
|
vlog_errors += 1;
|
||||||
break;
|
break;
|
||||||
case IVL_EX_NUMBER:
|
case IVL_EX_NUMBER:
|
||||||
emit_number(ivl_expr_bits(expr), ivl_expr_width(expr),
|
emit_expr_number(scope, expr, wid);
|
||||||
ivl_expr_signed(expr), ivl_expr_file(expr),
|
|
||||||
ivl_expr_lineno(expr));
|
|
||||||
break;
|
break;
|
||||||
case IVL_EX_PROPERTY:
|
case IVL_EX_PROPERTY:
|
||||||
emit_class_property(scope, expr, wid);
|
emit_class_property(scope, expr, wid);
|
||||||
break;
|
break;
|
||||||
case IVL_EX_REALNUM:
|
case IVL_EX_REALNUM:
|
||||||
emit_real_number(ivl_expr_dvalue(expr));
|
emit_expr_real_number(scope, expr, wid);
|
||||||
break;
|
break;
|
||||||
case IVL_EX_SCOPE:
|
case IVL_EX_SCOPE:
|
||||||
emit_expr_scope(scope, expr, wid);
|
emit_expr_scope(scope, expr, wid);
|
||||||
|
|
|
||||||
|
|
@ -312,7 +312,10 @@ void emit_scope_variables(ivl_scope_t scope)
|
||||||
fprintf(vlog_out, "%*cparameter ", indent, ' ');
|
fprintf(vlog_out, "%*cparameter ", indent, ' ');
|
||||||
emit_id(ivl_parameter_basename(par));
|
emit_id(ivl_parameter_basename(par));
|
||||||
fprintf(vlog_out, " = ");
|
fprintf(vlog_out, " = ");
|
||||||
|
/* Need to emit the parameters value not its name. */
|
||||||
|
emitting_param = par;
|
||||||
emit_expr(scope, pex, 0, 0);
|
emit_expr(scope, pex, 0, 0);
|
||||||
|
emitting_param = 0;
|
||||||
fprintf(vlog_out, ";");
|
fprintf(vlog_out, ";");
|
||||||
if (emit_file_line) {
|
if (emit_file_line) {
|
||||||
fprintf(vlog_out, " /* %s:%u */",
|
fprintf(vlog_out, " /* %s:%u */",
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,12 @@ extern int vlog_errors;
|
||||||
*/
|
*/
|
||||||
extern int sim_precision;
|
extern int sim_precision;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The expression code needs to know when a parameter definition is being
|
||||||
|
* emitted so it can emit the numeric value instead of the name.
|
||||||
|
*/
|
||||||
|
extern ivl_parameter_t emitting_param;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Keep the current indent level.
|
* Keep the current indent level.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue