mirror of
https://github.com/YosysHQ/yosys
synced 2025-06-29 01:18:46 +00:00
ast, read_verilog: unify location types, reduce filename copying
This commit is contained in:
parent
6ac9f79de6
commit
653c002ad0
12 changed files with 715 additions and 693 deletions
2
frontends/verilog/.gitignore
vendored
2
frontends/verilog/.gitignore
vendored
|
@ -2,6 +2,4 @@ verilog_lexer.cc
|
|||
verilog_parser.output
|
||||
verilog_parser.tab.cc
|
||||
verilog_parser.tab.hh
|
||||
position.hh
|
||||
location.hh
|
||||
stack.hh
|
||||
|
|
|
@ -3,11 +3,9 @@ GENFILES += frontends/verilog/verilog_parser.tab.cc
|
|||
GENFILES += frontends/verilog/verilog_parser.tab.hh
|
||||
GENFILES += frontends/verilog/verilog_parser.output
|
||||
GENFILES += frontends/verilog/verilog_lexer.cc
|
||||
GENFILES += frontends/verilog/location.hh
|
||||
GENFILES += frontends/verilog/position.hh
|
||||
GENFILES += frontends/verilog/stack.hh
|
||||
|
||||
frontends/verilog/verilog_parser.tab.cc: frontends/verilog/verilog_parser.y
|
||||
frontends/verilog/verilog_parser.tab.cc: frontends/verilog/verilog_parser.y frontends/verilog/verilog_location.h
|
||||
$(Q) mkdir -p $(dir $@)
|
||||
$(P) $(BISON) -Wall -Werror -o $@ -d -r all -b frontends/verilog/verilog_parser $<
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ using namespace VERILOG_FRONTEND;
|
|||
std::string ConstParser::fmt_maybe_loc(std::string msg) {
|
||||
std::string s;
|
||||
|
||||
s += stringf("%s:%d:", loc.filename, loc.first_line);
|
||||
s += stringf("%s:%d:", loc.begin.filename->c_str(), loc.begin.line);
|
||||
|
||||
s += msg;
|
||||
return s;
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include "verilog_frontend.h"
|
||||
#include "verilog_lexer.h"
|
||||
#include "verilog_error.h"
|
||||
#include "verilog_location.h"
|
||||
#include "preproc.h"
|
||||
#include "kernel/yosys.h"
|
||||
#include "libs/sha1/sha1.h"
|
||||
|
@ -277,8 +278,8 @@ struct VerilogFrontend : public Frontend {
|
|||
std::list<std::string> include_dirs;
|
||||
std::list<std::string> attributes;
|
||||
|
||||
ParseMode parse_mode;
|
||||
ParseState parse_state;
|
||||
ParseMode parse_mode = {};
|
||||
ParseState parse_state = {};
|
||||
parse_mode.sv = false;
|
||||
parse_mode.formal = false;
|
||||
parse_mode.noassert = false;
|
||||
|
@ -479,11 +480,6 @@ struct VerilogFrontend : public Frontend {
|
|||
break;
|
||||
}
|
||||
|
||||
VerilogLexer lexer(&parse_state, &parse_mode, &filename);
|
||||
frontend_verilog_yy::parser parser(&lexer, &parse_state, &parse_mode);
|
||||
lexer.set_debug(flag_debug_lexer);
|
||||
parser.set_debug_level(flag_debug_parser ? 1 : 0);
|
||||
|
||||
if (parse_mode.formal || !flag_nosynthesis)
|
||||
defines_map.add(parse_mode.formal ? "FORMAL" : "SYNTHESIS", "1");
|
||||
|
||||
|
@ -495,13 +491,9 @@ struct VerilogFrontend : public Frontend {
|
|||
parse_mode.formal ? "formal " : "", parse_mode.sv ? "SystemVerilog" : "Verilog", filename.c_str());
|
||||
|
||||
AST::sv_mode_but_global_and_used_for_literally_one_condition = parse_mode.sv;
|
||||
|
||||
AstSrcLocType top_loc = AstSrcLocType ( "read_verilog", 0, 0, 0, 0);
|
||||
parse_state.current_ast = new AST::AstNode(top_loc, AST::AST_DESIGN);
|
||||
|
||||
parse_state.lexin = f;
|
||||
std::string code_after_preproc;
|
||||
|
||||
parse_state.lexin = f;
|
||||
if (!flag_nopp) {
|
||||
code_after_preproc = frontend_verilog_preproc(*f, filename, defines_map, *design->verilog_defines, include_dirs, parse_state, parse_mode);
|
||||
if (flag_ppdump)
|
||||
|
@ -509,6 +501,15 @@ struct VerilogFrontend : public Frontend {
|
|||
parse_state.lexin = new std::istringstream(code_after_preproc);
|
||||
}
|
||||
|
||||
auto filename_shared = std::make_shared<std::string>(filename);
|
||||
auto top_loc = location();
|
||||
top_loc.begin.filename = filename_shared;
|
||||
parse_state.current_ast = new AST::AstNode(top_loc, AST::AST_DESIGN);
|
||||
VerilogLexer lexer(&parse_state, &parse_mode, filename_shared);
|
||||
frontend_verilog_yy::parser parser(&lexer, &parse_state, &parse_mode);
|
||||
lexer.set_debug(flag_debug_lexer);
|
||||
parser.set_debug_level(flag_debug_parser ? 1 : 0);
|
||||
|
||||
// make package typedefs available to parser
|
||||
add_package_types(parse_state.pkg_user_types, design->verilog_packages);
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "frontends/ast/ast.h"
|
||||
#include "frontends/verilog/verilog_parser.tab.hh"
|
||||
#include <string>
|
||||
#include <memory>
|
||||
|
||||
YOSYS_NAMESPACE_BEGIN
|
||||
|
||||
|
@ -15,7 +16,7 @@ namespace VERILOG_FRONTEND {
|
|||
ParseMode* mode;
|
||||
public:
|
||||
parser::location_type out_loc; // TODO private?
|
||||
VerilogLexer(ParseState* e, ParseMode* m, std::string* filename) : frontend_verilog_yyFlexLexer(e->lexin), extra(e), mode(m) {
|
||||
VerilogLexer(ParseState* e, ParseMode* m, std::shared_ptr<string> filename) : frontend_verilog_yyFlexLexer(e->lexin), extra(e), mode(m) {
|
||||
out_loc.begin.filename = filename;
|
||||
}
|
||||
~VerilogLexer() override {}
|
||||
|
@ -27,7 +28,8 @@ namespace VERILOG_FRONTEND {
|
|||
return parser::make_FRONTEND_VERILOG_YYEOF(out_loc);
|
||||
}
|
||||
private:
|
||||
std::vector<std::string> fn_stack;
|
||||
std::shared_ptr<std::string> current_filename;
|
||||
std::vector<std::shared_ptr<std::string>> fn_stack;
|
||||
std::vector<int> ln_stack;
|
||||
int LexerInput(char* buf, int max_size) override {
|
||||
return readsome(*extra->lexin, buf, max_size);
|
||||
|
|
|
@ -50,8 +50,10 @@
|
|||
|
||||
#include "frontends/verilog/verilog_lexer.h"
|
||||
#include "frontends/ast/ast.h"
|
||||
#include "frontends/verilog/verilog_location.h"
|
||||
#include "kernel/log.h"
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
|
||||
USING_YOSYS_NAMESPACE
|
||||
using namespace AST;
|
||||
|
@ -73,7 +75,7 @@ YOSYS_NAMESPACE_END
|
|||
if (mode->sv) return _tok; \
|
||||
log("Lexer warning: The SystemVerilog keyword `%s' (at %s:%d) is not "\
|
||||
"recognized unless read_verilog is called with -sv!\n", YYText(), \
|
||||
AST::current_filename.c_str(), yylineno); \
|
||||
current_filename->c_str(), yylineno); \
|
||||
string_t val = std::make_unique<std::string>(std::string("\\") + YYText()); \
|
||||
return parser::make_TOK_ID(std::move(val), out_loc);
|
||||
|
||||
|
@ -85,16 +87,17 @@ YOSYS_NAMESPACE_END
|
|||
// result = readsome(*extra->lexin, buf, max_size)
|
||||
|
||||
#define YY_USER_ACTION \
|
||||
out_loc.begin = out_loc.end; \
|
||||
for(int i = 0; YYText()[i] != '\0'; ++i){ \
|
||||
if(YYText()[i] == '\n') { \
|
||||
out_loc.end.line++; \
|
||||
out_loc.end.column = 1; \
|
||||
} \
|
||||
else { \
|
||||
out_loc.end.column++; \
|
||||
} \
|
||||
}
|
||||
out_loc.step(); \
|
||||
for(int i = 0; YYText()[i] != '\0'; ++i){ \
|
||||
if(YYText()[i] == '\n') { \
|
||||
out_loc.lines(); \
|
||||
} \
|
||||
else { \
|
||||
out_loc.columns(); \
|
||||
} \
|
||||
} \
|
||||
out_loc.begin.filename = current_filename; \
|
||||
out_loc.end.filename = current_filename;
|
||||
|
||||
#define YY_BREAK \
|
||||
break;
|
||||
|
@ -175,11 +178,12 @@ TIME_SCALE_SUFFIX [munpf]?s
|
|||
<INITIAL,SYNOPSYS_TRANSLATE_OFF>"`file_push "[^\n]* {
|
||||
fn_stack.push_back(current_filename);
|
||||
ln_stack.push_back(yylineno);
|
||||
current_filename = YYText()+11;
|
||||
if (!current_filename.empty() && current_filename.front() == '"')
|
||||
current_filename = current_filename.substr(1);
|
||||
if (!current_filename.empty() && current_filename.back() == '"')
|
||||
current_filename = current_filename.substr(0, current_filename.size()-1);
|
||||
std::string filename = YYText()+11;
|
||||
if (!filename.empty() && filename.front() == '"')
|
||||
filename = filename.substr(1);
|
||||
if (!filename.empty() && filename.back() == '"')
|
||||
filename = filename.substr(0, filename.size()-1);
|
||||
current_filename = std::make_shared<std::string>(filename);
|
||||
yylineno = (0);
|
||||
out_loc.begin.line = out_loc.end.line = 0;
|
||||
}
|
||||
|
@ -201,7 +205,7 @@ TIME_SCALE_SUFFIX [munpf]?s
|
|||
while (*p == ' ' || *p == '\t') p++;
|
||||
const char *q = *p ? p + 1 : p;
|
||||
while (*q && *q != '"') q++;
|
||||
current_filename = std::string(p).substr(1, q-p-1);
|
||||
current_filename = std::make_shared<std::string>(std::string(p).substr(1, q-p-1));
|
||||
}
|
||||
|
||||
"`file_notfound "[^\n]* {
|
||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue