In A.1.10
package_item ::=
package_or_generate_item_declaration
| anonymous_program
| package_export_declaration
| timeunits_declaration
In
Syntax 19-1
package_item ::=
package_or_generate_item_declaration
| anonymous_program
| package_export_declaration
| timeunits_declaration
In A.2.1.3 Type declarations
package_export_declaration ::=
export *::*;
| export package_import_item { , package_import_item } ;
After 19.2.2, insert new section
19.2.3 Exporting imported names from packages
package_export_declaration ::=
export
*::*;
| export
package_import_item { , package_import_item } ;
Syntax 19-3—Package export syntax (excerpt from Annex A)
By default, declarations imported into a package are not visible by way of
subsequent imports of that package. Package export declarations allow a
package to specify that imported declarations are to be made visible in
subsequent imports.
Wildcard Package Exports
An export of the form package_name::* exports all declarations that were actually imported
from package_name within the context of the exporting package. All
names from package_name, whether imported directly or through wildcard
imports, are made available. Symbols that are candidates for import but not
actually imported are not made available.
The special wildcard export form, export *::*; , exports all
imported declarations from all packages from which imports occur.
Direct Package Exports
An export of the form package_name::name makes the given
declaration available. It shall be an error if the given declaration is not a
candidate for import or if the declaration is not actually imported in the
package. If the declaration is an unreferenced candidate for import, the
export shall be considered to be a reference and shall import the declaration
into the package following the same rules as for a direct import of the name.
Imports of exported declarations
An import of a declaration made visible through an
export is equivalent to an import of the original declaration. Thus
direct or wildcard import of a declaration by way of multiple exported paths
does not cause conflicts.
Multiple exports of the same declaration
It is valid to specify multiple exports that export
the same actual declaration.
Examples:
package p1;
int x,y;
endpackage
package p2;
import p1::x;
export p1::*; //
exports p1::x as the name "x";
// p1::x and p2::x are the
same declaration
endpackage
package
p3;
import p1::*;
export p2::*;
int
q = x;
// p1::x and q are made available from p2. Although
p1::y
// is a candidate for import, it is not
actually imported
// since it is not referenced. Since p1::y
is not imported,
// it
is not made available by the export.
endpackage
package p4;
import p1::*;
export p1::*;
int y = x; // y is available as a direct
declaration;
// p1::x is made available
by the export
endpackage
package p5;
import p4::*;
export p1::x; //
p1::x is visible since it is exported
// from p4.
export p4::x; //
p4::x refers to the same declaration
// as p1::x so this is
legal.
endpackage
package p6;
import p1::*;
export p1::x;
int x; // Error. export
p1::x is considered to
// be a reference to
"x" so a subsequent
// declaration of x is
illegal.
endpackage
package p7;
int y;
endpackage
package p8;
import p7::y;
import p1::x;
export *::*; //
Exports both p7::y and p1::x.
endpackage
module top;
import p2::*;
import p4::*;
int y = x; // x is p1::x
endmodule
[Note to editor: Please update the numbers of Syntax
19-3, Syntax 19-4 and Syntax 19-5 to Syntax 19-4, Syntax 19-5 and Syntax 19-6.]