Re: [sv-bc] wildcard package imports, std, $unit

From: Greg Jaxon <Greg.Jaxon_at_.....>
Date: Thu May 17 2007 - 10:31:33 PDT
Gordon Vreugdenhil wrote:

> Bresticker, Shalom wrote:

>> What happens if I wildcard import a package which declares a name
>> which is also declared in the std built-in package?

> At this point in SV there is no special status for std so this should
> be a conflict and work in the same manner as normal.  Hopefully a tool
> would tell you about this and you could choose to use a package prefix
> reference to resolve to what you want.

When SV vendors implement collision of wildcard import candidacy, let's
suppose they mark up the identifier's placeholder in the destination
scope in a way that makes the second (and any later) arrivals disable
the candidate (perhaps by erasing its pointer back to which package had
promised to supply the name binding).  This step is already conditional,
since it is legal to wildcard import from the same package multiple times.
Systems already inspect the existing supplier's identity, and also check
that the candidate hasn't been previously disabled.

  It wouldn't take much to check whether the candidate is supplied by
the built-in "std" package.  Candidates in that initial state could be
rendered incapable of causing a disabling collision.

The original intent in the last sentence of section 8.10.1 ...
     "This mechanism allows functional extensions to the language
      in a backward compatible manner, without the addition of new
      keywords or polluting local name spaces."
... was to provide a place to do language extension which
would have NO IMPACT on users' codes if they already defined
the proposed names for the new feature.

  Giving the "std" package a lower priority in wildcard collisions is both
feasible and in keeping with the language design intent.  To formalize this,
we could edit the last sentence of 19.2.1, which currently says:

" If the same identifier is wildcard imported into a scope from
  two different packages, the identifier shall be undefined within
  that scope, and an error results if the identifier is used."

To say:

" If the same identifier is wildcard imported into the same scope from
  several different user-defined packages, the identifier shall
  not be wildcard-importable there from any package.
  An identifier which collides with the built-in and implicitly
  wildcard imported package "std" (see section 8.10.1), can be still
  be wildcard imported from a single user-defined package; the user's
  package takes precedence and is not disabled by the collision
  with "std".
  Identifiers that cannot be wildcard imported because of an excess
  of import candidates, must be explicitly declared or imported to
  be defined in that scope."

This rewrite also corrects the impression that a wildcard collision
can prevent you from declaring the name yourself.  It removes any question
of what would happen with /three/ different packages.  I also strengthened
the wording so that the domain in which collisions happen is exactly one
scope.  Wildcard imports into differently nested scopes do not collide;
they may shadow each other in the usual way, as Gord points out below.

Establishing the lower precedence of "std" is a complication, but it's really
minor compared to the already subtle and complicated semantics of wildcard
collision resolution.

Greg Jaxon (see PS below too)

> 
>>
>> What happens if I wildcard import a package which declares a name
>> which is also declared in $unit?
> 
> $unit is "kind of sort of" like a package, however its names are
> found lexically, not via import.  So if there is a lexically closer
> import, that wins.  Example:
>    package p;
>       int x;
>    endpackage
> 
>    int x;
> 
>    module m;
>       import p::*;
>       int y = x;    // means p::x
>    endmodule
> 
> This is exactly the same reason that one would use in the following:
> 
>    module m;
>      int x;
>      task t;
>         import p::*;
>         int y = x;    // means p::x
>      endtask
>    endmodule
> 
> Gord.
> 

P.S.

In addition to being implicitly wildcard imported into $unit, I think
we need 8.10.1 to say that std is also wildcarded into every package scope.
Packages don't nest within $unit (they are their own compilation unit).

And just to raise a few hairs ;-) those std identifiers, if used by a
package declaration, will chain into clients of the package - or at least be
governed in this respect by whatever new rules are adopted for package chaining.




-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Thu May 17 10:31:51 2007

This archive was generated by hypermail 2.1.8 : Thu May 17 2007 - 10:32:10 PDT