Factor out common code for warning about inconsistent timescales.
Also reword the warning for SystemVerilog, where `timescale is not
the only (or indeed preferred) way of specifying timescales.
(cherry picked from commit 9382d22063)
This commit is contained in:
parent
dec9a8b527
commit
a74c3a1207
21
PDelays.cc
21
PDelays.cc
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999-2011 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 1999-2017 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -26,11 +26,6 @@
|
||||||
# include "verinum.h"
|
# include "verinum.h"
|
||||||
# include "netmisc.h"
|
# include "netmisc.h"
|
||||||
|
|
||||||
bool dly_used_no_timescale = false;
|
|
||||||
bool dly_used_timescale = false;
|
|
||||||
bool display_ts_dly_warning = true;
|
|
||||||
|
|
||||||
|
|
||||||
PDelays::PDelays()
|
PDelays::PDelays()
|
||||||
{
|
{
|
||||||
delete_flag_ = true;
|
delete_flag_ = true;
|
||||||
|
|
@ -80,19 +75,7 @@ static NetExpr*calculate_val(Design*des, NetScope*scope, PExpr*expr)
|
||||||
{
|
{
|
||||||
NetExpr*dex = elab_and_eval(des, scope, expr, -1);
|
NetExpr*dex = elab_and_eval(des, scope, expr, -1);
|
||||||
|
|
||||||
/* Print a warning if we find default and `timescale based
|
check_for_inconsistent_delays(scope);
|
||||||
* delays in the design, since this is likely an error. */
|
|
||||||
if (scope->time_from_timescale()) dly_used_timescale = true;
|
|
||||||
else dly_used_no_timescale = true;
|
|
||||||
|
|
||||||
if (display_ts_dly_warning &&
|
|
||||||
dly_used_no_timescale && dly_used_timescale) {
|
|
||||||
cerr << "warning: Found both default and "
|
|
||||||
"`timescale based delays. Use" << endl;
|
|
||||||
cerr << " -Wtimescale to find the "
|
|
||||||
"module(s) with no `timescale." << endl;
|
|
||||||
display_ts_dly_warning = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the delay expression is a real constant or vector
|
/* If the delay expression is a real constant or vector
|
||||||
constant, then evaluate it, scale it to the local time
|
constant, then evaluate it, scale it to the local time
|
||||||
|
|
|
||||||
28
elaborate.cc
28
elaborate.cc
|
|
@ -2374,19 +2374,7 @@ static NetExpr*elaborate_delay_expr(PExpr*expr, Design*des, NetScope*scope)
|
||||||
{
|
{
|
||||||
NetExpr*dex = elab_and_eval(des, scope, expr, -1);
|
NetExpr*dex = elab_and_eval(des, scope, expr, -1);
|
||||||
|
|
||||||
/* Print a warning if we find default and `timescale based
|
check_for_inconsistent_delays(scope);
|
||||||
* delays in the design, since this is likely an error. */
|
|
||||||
if (scope->time_from_timescale()) dly_used_timescale = true;
|
|
||||||
else dly_used_no_timescale = true;
|
|
||||||
|
|
||||||
if (display_ts_dly_warning &&
|
|
||||||
dly_used_no_timescale && dly_used_timescale) {
|
|
||||||
cerr << "warning: Found both default and "
|
|
||||||
"`timescale based delays. Use" << endl;
|
|
||||||
cerr << " -Wtimescale to find the "
|
|
||||||
"module(s) with no `timescale." << endl;
|
|
||||||
display_ts_dly_warning = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the delay expression is a real constant or vector
|
/* If the delay expression is a real constant or vector
|
||||||
constant, then evaluate it, scale it to the local time
|
constant, then evaluate it, scale it to the local time
|
||||||
|
|
@ -5434,19 +5422,7 @@ void PSpecPath::elaborate(Design*des, NetScope*scope) const
|
||||||
ndelays = delays.size();
|
ndelays = delays.size();
|
||||||
if (ndelays > 12) ndelays = 12;
|
if (ndelays > 12) ndelays = 12;
|
||||||
|
|
||||||
/* Print a warning if we find default and `timescale based
|
check_for_inconsistent_delays(scope);
|
||||||
* delays in the design, since this is likely an error. */
|
|
||||||
if (scope->time_from_timescale()) dly_used_timescale = true;
|
|
||||||
else dly_used_no_timescale = true;
|
|
||||||
|
|
||||||
if (display_ts_dly_warning &&
|
|
||||||
dly_used_no_timescale && dly_used_timescale) {
|
|
||||||
cerr << "warning: Found both default and "
|
|
||||||
"`timescale based delays. Use" << endl;
|
|
||||||
cerr << " -Wtimescale to find the "
|
|
||||||
"module(s) with no `timescale." << endl;
|
|
||||||
display_ts_dly_warning = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Elaborate the delay values themselves. Remember to scale
|
/* Elaborate the delay values themselves. Remember to scale
|
||||||
them for the timescale/precision of the scope. */
|
them for the timescale/precision of the scope. */
|
||||||
|
|
|
||||||
37
netmisc.cc
37
netmisc.cc
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2016 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2017 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -1665,3 +1665,38 @@ NetScope* find_method_containing_scope(const LineInfo&, NetScope*scope)
|
||||||
|
|
||||||
return scope;
|
return scope;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print a warning if we find a mixture of default and explicit timescale
|
||||||
|
* based delays in the design, since this is likely an error.
|
||||||
|
*/
|
||||||
|
void check_for_inconsistent_delays(NetScope*scope)
|
||||||
|
{
|
||||||
|
static bool used_implicit_timescale = false;
|
||||||
|
static bool used_explicit_timescale = false;
|
||||||
|
static bool display_ts_dly_warning = true;
|
||||||
|
|
||||||
|
if (scope->time_from_timescale())
|
||||||
|
used_explicit_timescale = true;
|
||||||
|
else
|
||||||
|
used_implicit_timescale = true;
|
||||||
|
|
||||||
|
if (display_ts_dly_warning &&
|
||||||
|
used_explicit_timescale &&
|
||||||
|
used_implicit_timescale) {
|
||||||
|
if (gn_system_verilog()) {
|
||||||
|
cerr << "warning: Found both default and explicit "
|
||||||
|
"timescale based delays. Use" << endl;
|
||||||
|
cerr << " : -Wtimescale to find the design "
|
||||||
|
"element(s) with no explicit" << endl;
|
||||||
|
cerr << " : timescale." << endl;
|
||||||
|
} else {
|
||||||
|
cerr << "warning: Found both default and "
|
||||||
|
"`timescale based delays. Use" << endl;
|
||||||
|
cerr << " : -Wtimescale to find the "
|
||||||
|
"module(s) with no `timescale." << endl;
|
||||||
|
}
|
||||||
|
display_ts_dly_warning = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
12
netmisc.h
12
netmisc.h
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef IVL_netmisc_H
|
#ifndef IVL_netmisc_H
|
||||||
#define IVL_netmisc_H
|
#define IVL_netmisc_H
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999-2016 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 1999-2017 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -378,10 +378,6 @@ const char *human_readable_op(const char op, bool unary = false);
|
||||||
enum const_bool { C_NON, C_0, C_1, C_X };
|
enum const_bool { C_NON, C_0, C_1, C_X };
|
||||||
const_bool const_logical(const NetExpr*expr);
|
const_bool const_logical(const NetExpr*expr);
|
||||||
|
|
||||||
extern bool dly_used_no_timescale;
|
|
||||||
extern bool dly_used_timescale;
|
|
||||||
extern bool display_ts_dly_warning;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When scaling a real value to a time we need to do some standard
|
* When scaling a real value to a time we need to do some standard
|
||||||
* processing.
|
* processing.
|
||||||
|
|
@ -409,4 +405,10 @@ extern void assign_unpacked_with_bufz(Design*des, NetScope*scope,
|
||||||
|
|
||||||
extern NetPartSelect* detect_partselect_lval(Link&pin);
|
extern NetPartSelect* detect_partselect_lval(Link&pin);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print a warning if we find a mixture of default and explicit timescale
|
||||||
|
* based delays in the design, since this is likely an error.
|
||||||
|
*/
|
||||||
|
extern void check_for_inconsistent_delays(NetScope*scope);
|
||||||
|
|
||||||
#endif /* IVL_netmisc_H */
|
#endif /* IVL_netmisc_H */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue