Add support for package scope resolution for named events.

This commit is contained in:
Martin Whitaker 2019-09-29 21:11:01 +01:00
parent 12fe4f2bf3
commit c5c264400e
7 changed files with 41 additions and 16 deletions

View File

@ -1,7 +1,7 @@
#ifndef IVL_PExpr_H #ifndef IVL_PExpr_H
#define IVL_PExpr_H #define IVL_PExpr_H
/* /*
* Copyright (c) 1998-2016 Stephen Williams <steve@icarus.com> * Copyright (c) 1998-2019 Stephen Williams <steve@icarus.com>
* Copyright CERN 2013 / Stephen Williams (steve@icarus.com) * Copyright CERN 2013 / 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
@ -379,6 +379,8 @@ class PEIdent : public PExpr {
virtual bool is_collapsible_net(Design*des, NetScope*scope) const; virtual bool is_collapsible_net(Design*des, NetScope*scope) const;
const PPackage* package() const { return package_; }
const pform_name_t& path() const { return path_; } const pform_name_t& path() const { return path_; }
private: private:

View File

@ -416,8 +416,8 @@ PReturn::~PReturn()
delete expr_; delete expr_;
} }
PTrigger::PTrigger(const pform_name_t&e) PTrigger::PTrigger(PPackage*pkg, const pform_name_t&e)
: event_(e) : package_(pkg), event_(e)
{ {
} }

View File

@ -563,13 +563,14 @@ class PReturn : public Statement {
class PTrigger : public Statement { class PTrigger : public Statement {
public: public:
explicit PTrigger(const pform_name_t&ev); explicit PTrigger(PPackage*pkg, const pform_name_t&ev);
~PTrigger(); ~PTrigger();
virtual NetProc* elaborate(Design*des, NetScope*scope) const; virtual NetProc* elaborate(Design*des, NetScope*scope) const;
virtual void dump(ostream&out, unsigned ind) const; virtual void dump(ostream&out, unsigned ind) const;
private: private:
PPackage*package_;
pform_name_t event_; pform_name_t event_;
}; };

View File

@ -4310,7 +4310,13 @@ cerr << endl;
const NetExpr*par = 0; const NetExpr*par = 0;
NetEvent* eve = 0; NetEvent* eve = 0;
NetScope*found_in = symbol_search(this, des, scope, NetScope*use_scope = scope;
if (id->package()) {
use_scope = des->find_package(id->package()->pscope_name());
ivl_assert(*this, use_scope);
}
NetScope*found_in = symbol_search(this, des, use_scope,
id->path(), id->path(),
sig, par, eve); sig, par, eve);
@ -5337,11 +5343,17 @@ NetProc* PTrigger::elaborate(Design*des, NetScope*scope) const
{ {
assert(scope); assert(scope);
NetScope*use_scope = scope;
if (package_) {
use_scope = des->find_package(package_->pscope_name());
ivl_assert(*this, use_scope);
}
NetNet* sig = 0; NetNet* sig = 0;
const NetExpr*par = 0; const NetExpr*par = 0;
NetEvent* eve = 0; NetEvent* eve = 0;
NetScope*found_in = symbol_search(this, des, scope, event_, NetScope*found_in = symbol_search(this, des, use_scope, event_,
sig, par, eve); sig, par, eve);
if (found_in == 0) { if (found_in == 0) {

18
parse.y
View File

@ -6412,12 +6412,18 @@ statement_item /* This is roughly statement_item in the LRM */
FILE_NAME(tmp, @1); FILE_NAME(tmp, @1);
$$ = tmp; $$ = tmp;
} }
| K_TRIGGER hierarchy_identifier ';' | K_TRIGGER hierarchy_identifier ';'
{ PTrigger*tmp = pform_new_trigger(@2, *$2); { PTrigger*tmp = pform_new_trigger(@2, 0, *$2);
FILE_NAME(tmp, @1); FILE_NAME(tmp, @1);
delete $2; delete $2;
$$ = tmp; $$ = tmp;
} }
| K_TRIGGER PACKAGE_IDENTIFIER K_SCOPE_RES hierarchy_identifier
{ PTrigger*tmp = pform_new_trigger(@4, $2, *$4);
FILE_NAME(tmp, @1);
delete $4;
$$ = tmp;
}
| procedural_assertion_statement { $$ = $1; } | procedural_assertion_statement { $$ = $1; }

View File

@ -728,12 +728,15 @@ PEIdent* pform_new_ident(const struct vlltype&loc, const pform_name_t&name)
return new PEIdent(name); return new PEIdent(name);
} }
PTrigger* pform_new_trigger(const struct vlltype&loc, const pform_name_t&name) PTrigger* pform_new_trigger(const struct vlltype&loc, PPackage*pkg,
const pform_name_t&name)
{ {
if (gn_system_verilog() && name.size() == 1) if (gn_system_verilog() && pkg == 0 && name.size() == 1)
check_potential_imports(loc, name.back().name); check_potential_imports(loc, name.back().name);
return new PTrigger(name); PTrigger*tmp = new PTrigger(pkg, name);
FILE_NAME(tmp, loc);
return tmp;
} }
PGenerate* pform_parent_generate(void) PGenerate* pform_parent_generate(void)

View File

@ -248,7 +248,8 @@ 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, const pform_name_t&name); extern PTrigger* pform_new_trigger(const struct vlltype&loc, PPackage*pkg,
const pform_name_t&name);
/* /*
* Enter/exit name scopes. The push_scope function pushes the scope * Enter/exit name scopes. The push_scope function pushes the scope