Re: [sv-ec] question about name resolution in classes

From: Gordon Vreugdenhil <gordonv_at_.....>
Date: Fri Mar 24 2006 - 07:13:02 PST
Arturo Salz wrote:
> Gord,
> 
> I'm not sure I understood Francoise's suggestion. I believe she was
> trying to come up with some form of formalization that indeed causes
> lexical binding to take priority over other types of name binding (and
> any formalization would be a good thing). However, I believe that
> searching the outer scopes BEFORE the class hierarchy will inevitably
> result in the wrong thing. I feel rather strongly that binding the
> reference to i in method dump to child.i is absolutely wrong. Any rules
> that lead us to that conclusion should be quickly discarded.

I agree (for the determinable cases).  I don't think that one can
determine the binding statically in all cases; that is where my
example came from and what I am after -- rules for what constitutes
a non-determinable resolution and for what happens in such cases.

I wasn't trying to imply any agreement in my prior post, just trying
to make sure that I understood Francoise.

See my follow-up to Francoise's clarifications.

Gord.



> 	Arturo
> 
> -----Original Message-----
> From: owner-sv-ec@eda.org [mailto:owner-sv-ec@eda.org] On Behalf Of
> Gordon Vreugdenhil
> Sent: Thursday, March 23, 2006 10:28 PM
> To: francoise martinolle
> Cc: sv-ec@eda.org
> Subject: Re: [sv-ec] question about name resolution in classes
> 
> Fancoise,
> 
> I'd like to make sure that I understand your thinking here -- I
> think that you are suggesting that normal lexical and
> package name binding should occur *before* class hierarchical
> resolution, is that correct?
> 
> In particular, given a simpler example of my example:
> 
>     module child;
>        int i;
>        class base;
>            int i;
>        endclass
>        class derived extends base;
>            function void dump;
>                $display(i);
>            endfunction
>        endclass
>     endmodule
> 
> your view would be that the reference to "i" inside
> derived::dump would refer to child.i and not to
> the property in base.  If the user wanted to refer
> to the property in base, they would have to use
> super.i (or possibly this.i).  Is that a correct
> understanding of your description?
> 
> Gord
> 
> 
> 
> francoise martinolle wrote:
> 
>> 
>>Gordon,
>>
>>That is an interesting sophisticated example where the base class is
> 
> not
> 
>>known until elaboration.
>>I agree that there are some lexical ways for removing ambiguity in
> 
> which
> 
>>scope to resolve a
>>symbol (this, super). If we follow the normal verilog name resolution
> 
> rules,
> 
>>in your example, since there is a child.i, i would resolve to child.i
>>
>>My opinion is that if there was an import p::*, then the parser needs
> 
> to
> 
>>attempt to resolve
>>the symbol by looking up in the package. The package look up is now
> 
> part of
> 
>>name resolution
>>as I had pointed out before. 
>>If the user needs to specify that i is a property of the class
> 
> hierarchy,
> 
>>super.i needs
>>to be used. If the symbol is not resolved at that point (no import and
> 
> no
> 
>>static i), I would
>>think that in your case we ought to consider 'i' as an oomr which may
> 
> be
> 
>>resolved at
>>elaboration. We should only consider this last resort because type of
> 
> the
> 
>>immediate scope
>>containing the symbol 'i' is not known until elaboration and i because
> 
> it is
> 
>>a simple name
>>needs to be resolved in that scope.
>>That scope is not *complete* until elaboration.
>>This is a new case of oomrs. Usually (with the exceptions of functions
> 
> and
> 
>>tasks) an oomr
>>consists of more than 1 token separated by '.'
>>
>>In summary, I expect the following:
>>
>>During parsing, normal Verilog name resolution rules (augmented by
>>systemVerilog package look up)
>>apply, 
>>then if the symbol is still undefined and the scope in which it
> 
> appears is a
> 
>>type which is
>>not known until elaboration, then the symbol is an oomr which is
> 
> resolved at
> 
>>elaboration when the type
>>is known.
>>
>>Another approach is to avoid the oomr for simple name and require that
> 
> i be
> 
>>resolved at parsing time.
>>However if super.i is used, allow the oomr to be resolved at
> 
> elaboration.
> 
>>Francoise
>>    '
>>
>>-----Original Message-----
>>From: owner-sv-ec@eda.org [mailto:owner-sv-ec@eda.org] On Behalf Of
> 
> Gordon
> 
>>Vreugdenhil
>>Sent: Thursday, March 23, 2006 6:40 PM
>>To: francoise martinolle
>>Cc: sv-ec@eda.org
>>Subject: Re: [sv-ec] question about name resolution in classes
>>
>>Francoise,
>>
>>This is an area that is quite a bit more interesting than even your
> 
> example.
> 
>>The basic question is how to align lexical (and package) search rules
> 
> with
> 
>>class member and property lookup.
>>
>>In the package case (such as yours), since the package is required to
> 
> exist,
> 
>>the resolution of the base type is required to be known, so I think
> 
> the
> 
>>intuitive answer is that "i" is the member reference and needs to be
>>resolved as such.  It isn't clear to me however that this is going  to
> 
> end
> 
>>up being the answer.
>>
>>There are other contexts which are far more difficult since there are
>>separate compilation issues that come into play.
>>
>>Consider:
>>
>>    module child;
>>       parameter type T = int;
>>
>>       int i;
>>       class derived extends T;
>>           function void dump;
>>               $display(i);
>>           endfunction
>>       endclass
>>    endmodule
>>
>>    package p;
>>       class base;
>>           bit b;
>>       endclass
>>    endpackage
>>
>>    module top;
>>       class base;
>>          int i;
>>       endclas
>>
>>       child #(base) c1();
>>       child #(p::base) c2();
>>    endmodule
>>
>>In this scenario, what does "i" mean in class derived?  You can't
> 
> possibly
> 
>>know what it is or whether it is even lexically resolved to child.i or
>>resolved in the context of the class hierarchy.
>>In my example, the answer changes in the different module instances.
>>
>>Since module child is a valid module for separate compilation there is
> 
> no
> 
>>way to determine the answer at compilation; elaboration time is the
> 
> earliest
> 
>>at which this can be resolved.
>>
>>This is complicated by the package import rules.
>>If you didn't have "i" declared in "child" but it was potentially
> 
> visible,
> 
>>would you do the import and make it actually visible?
>>
>>One reasonable approach to the general problem is to require a "this."
> 
> or
> 
>>"super." prefix for references to inherited members in at least some
>>situations.
>>
>>I don't think there is any ideal solution to the naming issue since
> 
> you
> 
>>either have to deal with syntax requirements or have to try to define
> 
> some
> 
>>reasonable rules for when an implementation is required to know things
> 
> about
> 
>>the inheritance structure and when the user is required to
> 
> disambiguate.
> 
>>This is loosely related to the issues with randomize() that Ray and I
> 
> have
> 
>>been working on a proposal to address.
>>
>>Gord.
>>
>>
>>francoise martinolle wrote:
>>
>>
>>>Supposed I have a base class in a package and I create a derived class
> 
> 
>>>of that class in a module. I do not import the package but I use the 
>>>package scope syntax to indicate the base class. Does this cause all 
>>>the class item declaration of the BASE class to be visible in the 
>>>derived class?
>>>
>>>I think it should.
>>>
>>>
>>>package p;
>>>class BASE;
>>> rand logic i;
>>>endclass
>>>endpackage
>>>
>>>
>>>module top;
>>>class derived extends p::BASE;
>>>      constraint c1 { i == 1'b1};
>>>endclass
>>>endmodule
>>>
>>
>>
>>--
>>--------------------------------------------------------------------
>>Gordon Vreugdenhil                                503-685-0808
>>Model Technology (Mentor Graphics)                gordonv@model.com
>>
> 
> 

-- 
--------------------------------------------------------------------
Gordon Vreugdenhil                                503-685-0808
Model Technology (Mentor Graphics)                gordonv@model.com
Received on Fri Mar 24 07:13:09 2006

This archive was generated by hypermail 2.1.8 : Fri Mar 24 2006 - 07:13:14 PST