diff --git a/PExpr.h b/PExpr.h index 00588293b..fd91dc6a8 100644 --- a/PExpr.h +++ b/PExpr.h @@ -1,7 +1,7 @@ #ifndef IVL_PExpr_H #define IVL_PExpr_H /* - * Copyright (c) 1998-2016 Stephen Williams + * Copyright (c) 1998-2019 Stephen Williams * Copyright CERN 2013 / Stephen Williams (steve@icarus.com) * * 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; + const PPackage* package() const { return package_; } + const pform_name_t& path() const { return path_; } private: diff --git a/Statement.cc b/Statement.cc index 1e587758a..e5f5f169e 100644 --- a/Statement.cc +++ b/Statement.cc @@ -416,8 +416,8 @@ PReturn::~PReturn() delete expr_; } -PTrigger::PTrigger(const pform_name_t&e) -: event_(e) +PTrigger::PTrigger(PPackage*pkg, const pform_name_t&e) +: package_(pkg), event_(e) { } diff --git a/Statement.h b/Statement.h index 95d453195..ae5e162b6 100644 --- a/Statement.h +++ b/Statement.h @@ -563,13 +563,14 @@ class PReturn : public Statement { class PTrigger : public Statement { public: - explicit PTrigger(const pform_name_t&ev); + explicit PTrigger(PPackage*pkg, const pform_name_t&ev); ~PTrigger(); virtual NetProc* elaborate(Design*des, NetScope*scope) const; virtual void dump(ostream&out, unsigned ind) const; private: + PPackage*package_; pform_name_t event_; }; diff --git a/elaborate.cc b/elaborate.cc index 4a06303c7..572c09f7d 100644 --- a/elaborate.cc +++ b/elaborate.cc @@ -4310,7 +4310,13 @@ cerr << endl; const NetExpr*par = 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(), sig, par, eve); @@ -5337,11 +5343,17 @@ NetProc* PTrigger::elaborate(Design*des, NetScope*scope) const { assert(scope); + NetScope*use_scope = scope; + if (package_) { + use_scope = des->find_package(package_->pscope_name()); + ivl_assert(*this, use_scope); + } + NetNet* sig = 0; const NetExpr*par = 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); if (found_in == 0) { diff --git a/parse.y b/parse.y index 5186edf3b..462508ad5 100644 --- a/parse.y +++ b/parse.y @@ -6412,12 +6412,18 @@ statement_item /* This is roughly statement_item in the LRM */ FILE_NAME(tmp, @1); $$ = tmp; } - | K_TRIGGER hierarchy_identifier ';' - { PTrigger*tmp = pform_new_trigger(@2, *$2); - FILE_NAME(tmp, @1); - delete $2; - $$ = tmp; - } + | K_TRIGGER hierarchy_identifier ';' + { PTrigger*tmp = pform_new_trigger(@2, 0, *$2); + FILE_NAME(tmp, @1); + delete $2; + $$ = 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; } diff --git a/pform.cc b/pform.cc index df407724c..5f3f342fa 100644 --- a/pform.cc +++ b/pform.cc @@ -728,12 +728,15 @@ PEIdent* pform_new_ident(const struct vlltype&loc, const pform_name_t&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); - return new PTrigger(name); + PTrigger*tmp = new PTrigger(pkg, name); + FILE_NAME(tmp, loc); + return tmp; } PGenerate* pform_parent_generate(void) diff --git a/pform.h b/pform.h index 18d514d85..aba405ad0 100644 --- a/pform.h +++ b/pform.h @@ -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 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