mirror of
https://github.com/YosysHQ/yosys
synced 2025-07-21 11:52:07 +00:00
read_verilog, ast: use unified locations in errors and simplify dependencies
This commit is contained in:
parent
41d9a1b88e
commit
56058b3ed4
7 changed files with 16 additions and 23 deletions
1
frontends/verilog/.gitignore
vendored
1
frontends/verilog/.gitignore
vendored
|
@ -2,4 +2,3 @@ verilog_lexer.cc
|
||||||
verilog_parser.output
|
verilog_parser.output
|
||||||
verilog_parser.tab.cc
|
verilog_parser.tab.cc
|
||||||
verilog_parser.tab.hh
|
verilog_parser.tab.hh
|
||||||
stack.hh
|
|
||||||
|
|
|
@ -3,18 +3,16 @@ GENFILES += frontends/verilog/verilog_parser.tab.cc
|
||||||
GENFILES += frontends/verilog/verilog_parser.tab.hh
|
GENFILES += frontends/verilog/verilog_parser.tab.hh
|
||||||
GENFILES += frontends/verilog/verilog_parser.output
|
GENFILES += frontends/verilog/verilog_parser.output
|
||||||
GENFILES += frontends/verilog/verilog_lexer.cc
|
GENFILES += frontends/verilog/verilog_lexer.cc
|
||||||
GENFILES += frontends/verilog/stack.hh
|
|
||||||
|
|
||||||
frontends/verilog/verilog_parser.tab.cc: frontends/verilog/verilog_parser.y frontends/verilog/verilog_location.h
|
frontends/verilog/verilog_parser.tab.cc: frontends/verilog/verilog_parser.y
|
||||||
$(Q) mkdir -p $(dir $@)
|
$(Q) mkdir -p $(dir $@)
|
||||||
$(P) $(BISON) -Wall -Werror -o $@ -d -r all -b frontends/verilog/verilog_parser $<
|
$(P) $(BISON) -Wall -Werror -o $@ -d -r all -b frontends/verilog/verilog_parser $<
|
||||||
|
|
||||||
frontends/verilog/verilog_parser.tab.hh: frontends/verilog/verilog_parser.tab.cc
|
frontends/verilog/verilog_parser.tab.hh: frontends/verilog/verilog_parser.tab.cc
|
||||||
frontends/verilog/verilog_frontend.h: frontends/verilog/verilog_parser.tab.hh
|
|
||||||
frontends/verilog/verilog_error.h: frontends/verilog/verilog_parser.tab.hh
|
|
||||||
|
|
||||||
frontends/verilog/preproc.o: frontends/verilog/verilog_parser.tab.hh
|
frontends/verilog/preproc.o: frontends/verilog/verilog_parser.tab.hh
|
||||||
|
|
||||||
|
frontends/verilog/verilog_lexer.h: frontends/verilog/verilog_parser.tab.hh
|
||||||
frontends/verilog/verilog_lexer.cc: frontends/verilog/verilog_lexer.l frontends/verilog/verilog_parser.tab.cc
|
frontends/verilog/verilog_lexer.cc: frontends/verilog/verilog_lexer.l frontends/verilog/verilog_parser.tab.cc
|
||||||
$(Q) mkdir -p $(dir $@)
|
$(Q) mkdir -p $(dir $@)
|
||||||
$(P) flex -o frontends/verilog/verilog_lexer.cc $<
|
$(P) flex -o frontends/verilog/verilog_lexer.cc $<
|
||||||
|
|
|
@ -25,6 +25,12 @@
|
||||||
|
|
||||||
USING_YOSYS_NAMESPACE
|
USING_YOSYS_NAMESPACE
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Legacy behavior is to only track lines. Now we have columns too, but we don't
|
||||||
|
* report them in errors.
|
||||||
|
* TODO: report columns, too
|
||||||
|
*/
|
||||||
|
|
||||||
[[noreturn]]
|
[[noreturn]]
|
||||||
static void verr_at(std::string filename, int begin_line, char const *fmt, va_list ap)
|
static void verr_at(std::string filename, int begin_line, char const *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
|
@ -36,14 +42,6 @@ static void verr_at(std::string filename, int begin_line, char const *fmt, va_li
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VERILOG_FRONTEND::err_at_ast(AST::AstSrcLocType loc, char const *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
va_start(args, fmt);
|
|
||||||
verr_at(*loc.begin.filename, loc.begin.line, fmt, args);
|
|
||||||
va_end(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
[[noreturn]]
|
[[noreturn]]
|
||||||
void VERILOG_FRONTEND::err_at_loc(location loc, char const *fmt, ...)
|
void VERILOG_FRONTEND::err_at_loc(location loc, char const *fmt, ...)
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,17 +5,10 @@
|
||||||
#include "frontends/ast/ast.h"
|
#include "frontends/ast/ast.h"
|
||||||
#include "frontends/verilog/verilog_location.h"
|
#include "frontends/verilog/verilog_location.h"
|
||||||
|
|
||||||
#if ! defined(yyFlexLexerOnce)
|
|
||||||
#define yyFlexLexer frontend_verilog_yyFlexLexer
|
|
||||||
#include <FlexLexer.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
YOSYS_NAMESPACE_BEGIN
|
YOSYS_NAMESPACE_BEGIN
|
||||||
|
|
||||||
namespace VERILOG_FRONTEND
|
namespace VERILOG_FRONTEND
|
||||||
{
|
{
|
||||||
[[noreturn]]
|
|
||||||
void err_at_ast(AST::AstSrcLocType loc, char const *fmt, ...);
|
|
||||||
[[noreturn]]
|
[[noreturn]]
|
||||||
void err_at_loc(location loc, char const *fmt, ...);
|
void err_at_loc(location loc, char const *fmt, ...);
|
||||||
};
|
};
|
||||||
|
|
|
@ -51,7 +51,7 @@ static std::list<std::vector<std::string>> verilog_defaults_stack;
|
||||||
static void error_on_dpi_function(AST::AstNode *node)
|
static void error_on_dpi_function(AST::AstNode *node)
|
||||||
{
|
{
|
||||||
if (node->type == AST::AST_DPI_FUNCTION)
|
if (node->type == AST::AST_DPI_FUNCTION)
|
||||||
err_at_ast(node->location, "Found DPI function %s.\n", node->str.c_str());
|
err_at_loc(node->location, "Found DPI function %s.\n", node->str.c_str());
|
||||||
for (auto& child : node->children)
|
for (auto& child : node->children)
|
||||||
error_on_dpi_function(child.get());
|
error_on_dpi_function(child.get());
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,11 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#if ! defined(yyFlexLexerOnce)
|
||||||
|
#define yyFlexLexer frontend_verilog_yyFlexLexer
|
||||||
|
#include <FlexLexer.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
YOSYS_NAMESPACE_BEGIN
|
YOSYS_NAMESPACE_BEGIN
|
||||||
|
|
||||||
namespace VERILOG_FRONTEND {
|
namespace VERILOG_FRONTEND {
|
||||||
|
|
|
@ -200,7 +200,7 @@
|
||||||
if (type_node->range_left >= 0 && type_node->range_right >= 0) {
|
if (type_node->range_left >= 0 && type_node->range_right >= 0) {
|
||||||
// type already restricts the range
|
// type already restricts the range
|
||||||
if (range_node) {
|
if (range_node) {
|
||||||
err_at_ast(type_node->location, "integer/genvar types cannot have packed dimensions.");
|
err_at_loc(type_node->location, "integer/genvar types cannot have packed dimensions.");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
range_node = makeRange(type_node->location, type_node->range_left, type_node->range_right, false);
|
range_node = makeRange(type_node->location, type_node->range_left, type_node->range_right, false);
|
||||||
|
@ -217,7 +217,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!valid)
|
if (!valid)
|
||||||
err_at_ast(type_node->location, "wire/reg/logic packed dimension must be of the form [<expr>:<expr>]");
|
err_at_loc(type_node->location, "wire/reg/logic packed dimension must be of the form [<expr>:<expr>]");
|
||||||
}
|
}
|
||||||
|
|
||||||
return range_node;
|
return range_node;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue