Pass lexical position information to PTrigger and PNBTrigger objects.

This commit is contained in:
Martin Whitaker 2024-02-19 10:30:32 +00:00
parent cd76bd2371
commit 1c28948484
6 changed files with 26 additions and 22 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998-2021 Stephen Williams (steve@icarus.com) * Copyright (c) 1998-2024 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
@ -396,8 +396,8 @@ PReturn::~PReturn()
delete expr_; delete expr_;
} }
PTrigger::PTrigger(PPackage*pkg, const pform_name_t&ev) PTrigger::PTrigger(PPackage*pkg, const pform_name_t&ev, unsigned lexical_pos)
: event_(pkg, ev) : event_(pkg, ev), lexical_pos_(lexical_pos)
{ {
} }
@ -405,8 +405,8 @@ PTrigger::~PTrigger()
{ {
} }
PNBTrigger::PNBTrigger(const pform_name_t&ev, PExpr*dly) PNBTrigger::PNBTrigger(const pform_name_t&ev, unsigned lexical_pos, PExpr*dly)
: event_(ev), dly_(dly) : event_(ev), lexical_pos_(lexical_pos), dly_(dly)
{ {
} }

View File

@ -1,7 +1,7 @@
#ifndef IVL_Statement_H #ifndef IVL_Statement_H
#define IVL_Statement_H #define IVL_Statement_H
/* /*
* Copyright (c) 1998-2021 Stephen Williams (steve@icarus.com) * Copyright (c) 1998-2024 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
@ -599,7 +599,7 @@ class PReturn : public Statement {
class PTrigger : public Statement { class PTrigger : public Statement {
public: public:
explicit PTrigger(PPackage*pkg, const pform_name_t&ev); explicit PTrigger(PPackage*pkg, const pform_name_t&ev, unsigned lexical_pos);
~PTrigger(); ~PTrigger();
virtual NetProc* elaborate(Design*des, NetScope*scope) const; virtual NetProc* elaborate(Design*des, NetScope*scope) const;
@ -607,11 +607,12 @@ class PTrigger : public Statement {
private: private:
pform_scoped_name_t event_; pform_scoped_name_t event_;
unsigned lexical_pos_;
}; };
class PNBTrigger : public Statement { class PNBTrigger : public Statement {
public: public:
explicit PNBTrigger(const pform_name_t&ev, PExpr*dly); explicit PNBTrigger(const pform_name_t&ev, unsigned lexical_pos, PExpr*dly);
~PNBTrigger(); ~PNBTrigger();
virtual NetProc* elaborate(Design*des, NetScope*scope) const; virtual NetProc* elaborate(Design*des, NetScope*scope) const;
@ -619,6 +620,7 @@ class PNBTrigger : public Statement {
private: private:
pform_name_t event_; pform_name_t event_;
unsigned lexical_pos_;
PExpr*dly_; PExpr*dly_;
}; };

View File

@ -6038,7 +6038,7 @@ NetProc* PTrigger::elaborate(Design*des, NetScope*scope) const
ivl_assert(*this, scope); ivl_assert(*this, scope);
symbol_search_results sr; symbol_search_results sr;
if (!symbol_search(this, des, scope, event_, UINT_MAX, &sr)) { if (!symbol_search(this, des, scope, event_, lexical_pos_, &sr)) {
cerr << get_fileline() << ": error: event <" << event_ << ">" cerr << get_fileline() << ": error: event <" << event_ << ">"
<< " not found." << endl; << " not found." << endl;
des->errors += 1; des->errors += 1;
@ -6062,7 +6062,7 @@ NetProc* PNBTrigger::elaborate(Design*des, NetScope*scope) const
ivl_assert(*this, scope); ivl_assert(*this, scope);
symbol_search_results sr; symbol_search_results sr;
if (!symbol_search(this, des, scope, event_, UINT_MAX, &sr)) { if (!symbol_search(this, des, scope, event_, lexical_pos_, &sr)) {
cerr << get_fileline() << ": error: event <" << event_ << ">" cerr << get_fileline() << ": error: event <" << event_ << ">"
<< " not found." << endl; << " not found." << endl;
des->errors += 1; des->errors += 1;

12
parse.y
View File

@ -6766,35 +6766,35 @@ statement_item /* This is roughly statement_item in the LRM */
$$ = tmp; $$ = tmp;
} }
| K_TRIGGER hierarchy_identifier ';' | K_TRIGGER hierarchy_identifier ';'
{ PTrigger*tmp = pform_new_trigger(@2, 0, *$2); { PTrigger*tmp = pform_new_trigger(@2, 0, *$2, @2.lexical_pos);
delete $2; delete $2;
$$ = tmp; $$ = tmp;
} }
| K_TRIGGER package_scope hierarchy_identifier | K_TRIGGER package_scope hierarchy_identifier
{ lex_in_package_scope(0); { lex_in_package_scope(0);
PTrigger*tmp = pform_new_trigger(@3, $2, *$3); PTrigger*tmp = pform_new_trigger(@3, $2, *$3, @3.lexical_pos);
delete $3; delete $3;
$$ = tmp; $$ = tmp;
} }
/* FIXME: Does this need support for package resolution like above? */ /* FIXME: Does this need support for package resolution like above? */
| K_NB_TRIGGER hierarchy_identifier ';' | K_NB_TRIGGER hierarchy_identifier ';'
{ PNBTrigger*tmp = pform_new_nb_trigger(@2, 0, *$2); { PNBTrigger*tmp = pform_new_nb_trigger(@2, 0, *$2, @2.lexical_pos);
delete $2; delete $2;
$$ = tmp; $$ = tmp;
} }
| K_NB_TRIGGER delay1 hierarchy_identifier ';' | K_NB_TRIGGER delay1 hierarchy_identifier ';'
{ PNBTrigger*tmp = pform_new_nb_trigger(@3, $2, *$3); { PNBTrigger*tmp = pform_new_nb_trigger(@3, $2, *$3, @3.lexical_pos);
delete $3; delete $3;
$$ = tmp; $$ = tmp;
} }
| K_NB_TRIGGER event_control hierarchy_identifier ';' | K_NB_TRIGGER event_control hierarchy_identifier ';'
{ PNBTrigger*tmp = pform_new_nb_trigger(@3, 0, *$3); { PNBTrigger*tmp = pform_new_nb_trigger(@3, 0, *$3, @3.lexical_pos);
delete $3; delete $3;
$$ = tmp; $$ = tmp;
yywarn(@1, "sorry: ->> with event control is not currently supported."); yywarn(@1, "sorry: ->> with event control is not currently supported.");
} }
| K_NB_TRIGGER K_repeat '(' expression ')' event_control hierarchy_identifier ';' | K_NB_TRIGGER K_repeat '(' expression ')' event_control hierarchy_identifier ';'
{ PNBTrigger*tmp = pform_new_nb_trigger(@7, 0, *$7); { PNBTrigger*tmp = pform_new_nb_trigger(@7, 0, *$7, @7.lexical_pos);
delete $7; delete $7;
$$ = tmp; $$ = tmp;
yywarn(@1, "sorry: ->> with repeat event control is not currently supported."); yywarn(@1, "sorry: ->> with repeat event control is not currently supported.");

View File

@ -712,19 +712,20 @@ PEIdent* pform_new_ident(const struct vlltype&loc, const pform_name_t&name)
} }
PTrigger* pform_new_trigger(const struct vlltype&loc, PPackage*pkg, PTrigger* pform_new_trigger(const struct vlltype&loc, PPackage*pkg,
const pform_name_t&name) const pform_name_t&name, unsigned lexical_pos)
{ {
if (gn_system_verilog()) if (gn_system_verilog())
check_potential_imports(loc, name.front().name, false); check_potential_imports(loc, name.front().name, false);
PTrigger*tmp = new PTrigger(pkg, name); PTrigger*tmp = new PTrigger(pkg, name, lexical_pos);
FILE_NAME(tmp, loc); FILE_NAME(tmp, loc);
return tmp; return tmp;
} }
PNBTrigger* pform_new_nb_trigger(const struct vlltype&loc, PNBTrigger* pform_new_nb_trigger(const struct vlltype&loc,
const list<PExpr*>*dly, const list<PExpr*>*dly,
const pform_name_t&name) const pform_name_t&name,
unsigned lexical_pos)
{ {
if (gn_system_verilog()) if (gn_system_verilog())
check_potential_imports(loc, name.front().name, false); check_potential_imports(loc, name.front().name, false);
@ -735,7 +736,7 @@ PNBTrigger* pform_new_nb_trigger(const struct vlltype&loc,
tmp_dly = dly->front(); tmp_dly = dly->front();
} }
PNBTrigger*tmp = new PNBTrigger(name, tmp_dly); PNBTrigger*tmp = new PNBTrigger(name, lexical_pos, tmp_dly);
FILE_NAME(tmp, loc); FILE_NAME(tmp, loc);
return tmp; return tmp;
} }

View File

@ -230,10 +230,11 @@ extern void pform_add_modport_port(const struct vlltype&loc,
extern PEIdent* pform_new_ident(const struct vlltype&loc, const pform_name_t&name); extern PEIdent* pform_new_ident(const struct vlltype&loc, const pform_name_t&name);
extern PTrigger* pform_new_trigger(const struct vlltype&loc, PPackage*pkg, extern PTrigger* pform_new_trigger(const struct vlltype&loc, PPackage*pkg,
const pform_name_t&name); const pform_name_t&name, unsigned lexical_pos);
extern PNBTrigger* pform_new_nb_trigger(const struct vlltype&loc, extern PNBTrigger* pform_new_nb_trigger(const struct vlltype&loc,
const std::list<PExpr*>*dly, const std::list<PExpr*>*dly,
const pform_name_t&name); const pform_name_t&name,
unsigned lexical_pos);
/* /*
* Enter/exit name scopes. The push_scope function pushes the scope * Enter/exit name scopes. The push_scope function pushes the scope