Re: [sv-bc] Task function identifier searching rule

From: Surya Pratik Saha <spsaha_at_.....>
Date: Tue Jan 13 2009 - 20:59:55 PST
Hi Gordon,
The algorithm you defined seems to me same as mine. What do you think?

Regards
Surya



-------- Original Message  --------
Subject: Re:[sv-bc] Task function identifier searching rule
From: Gordon Vreugdenhil <gordonv@model.com>
To: Steven Sharp <sharp@cadence.com>
Cc: spsaha@cal.interrasystems.com, sv-bc@eda.org
Date: Tuesday, January 13, 2009 12:08:02 PM
> Steven, I think your description is a bit misleading.
>
> The first pass isn't really just lexical imports.
>
> For example, the case that fails in that approach is the following:
>
>   package p;
>     function int f();
>       return 1;
>     endfunction
>   endpackage
>
>   module top;
>      import p::*;
>      if (1) begin:b
>         int x = f();         // what am I
>         function int f();
>           return 2;
>         endfunction
>      end
>   endmodule
>
> If you do a pure lexical import alg first, you bind f in
> "what am I" to p::f; I am sure that you agree that is incorrect.
>
>
> So, here is what I think an approximate "simple algorithm" is
> for non-method tf name reference:
>
>    At the point of reference, consider all current potentially visible
>    names from imports in the current lexical scope (i.e. those from 
> imports
>    prior to the point of reference).  If there is a match we're done.  If
>    not, at the close of the scope determine if "f" now matches in the 
> scope.
>    If so, that is the match and we're done.
>
>    If not, close the scope and treat the "point of reference" for
>    "f" as being the point at which the scope closes.  Repeat the above
>    process as scopes close.  If $unit closes without a resolution
>    of the name "f", then it is a truly upwards hierarchical reference
>    in the instance tree.
>
> I think that correctly covers all of the situations and intent of
> normal (non-method) function and task resolution.  I certainly is
> the most concise way I've come up with to describe what I believe
> is the intent of the rules.
>
> Gord.
>
> Steven Sharp wrote:
>>> From: Surya Pratik Saha <spsaha@cal.interrasystems.com>
>>
>>> So I am just writing a complete algorithm in my own way to find out 
>>> the identifier for task enable and function call:
>>>
>>> -- Search the identifier in the current name space/scope completely 
>>> and any wild card import statement present lexically before that in 
>>> the same scope.
>>> -- If not found, go upper lexical scope to do the complete search, 
>>> wild card import statement to be considered which are present 
>>> lexically before the current name space/scope.
>>> -- Repeat above rule until not found.
>>>
>>> Please confirm if my understanding correct.
>>
>> The problem with this is that you are trying to resolve task and 
>> function
>> names in one pass.  The actual algorithm is based on more than one pass.
>>
>> The first pass is the normal one for simple identifier names.  It will
>> only find names declared before this reference, or imports seen before
>> this reference.  It goes from innermost lexical scope outward.  This 
>> pass
>> can cause names to be imported.
>>
>> If the name is not found, and it is a task or function name, then it is
>> considered to be a hierarchical name, and its resolution is deferred 
>> until
>> later.
>>
>> When a task or function name is resolved hierarchically, it uses the
>> normal resolution for hierarchical names.  This searches nested scopes
>> until it reaches the module level, after which it starts searching up
>> from the point of instantiation, repeating this as necessary.  During
>> this search, all names in the scope are considered, regardless of the
>> position of the declaration.  It is this pass that gives you the ability
>> to make forward references to tasks and functions.
>>
>> As I understand it, this second pass does not consider imported names,
>> nor will it cause any names to be imported.
>>
>> Each of these passes is relatively simple.  Again, the first one is the
>> normal one for simple identifiers.  The second one is the normal one for
>> hierarchical names.  It is only the fact that both get applied to task
>> and function names that makes the result seem complex.  This is 
>> especially
>> true if you insist on trying to define the rules in terms of a single
>> complicated pass instead of two simpler ones.
>>
>> Unfortunately, this has been made more complex.  The hierarchical search
>> for task and function names gives the appearance of allowing forward 
>> name
>> references.  However, the hierarchical search does not look into the
>> $unit scope.  That is only searched during the first lexical scope
>> search.  That does not allow forward references into the $unit scope.
>> Some people felt that this should be allowed.  So now a kludge rule
>> has been added to allow it, which turns the simple special rule
>> "Treat unresolved task and function names as hierarchical names", into
>> a much more special case.
>>
>>
>>> I am not sure whether it is right platform or not to discuss, but I 
>>> think implementing this is tough though, as we need to defer the 
>>> searching until whole design is processed and the corresponding 
>>> object model is populated. Also we need to keep a list of wild card 
>>> import statements present lexically before and associate this with 
>>> each nested scope and function call/task enable.
>>
>> You believe this because you are trying to come up with an algorithm
>> that can do this in one pass.  Breaking this into two passes simplifies
>> these issues.
>> The second pass is the hierarchical name resolution pass.  It always
>> needed to be deferred until the whole design was processed (though it is
>> possible to do an early attempt to resolve any hierarchical names that
>> can be resolved locally to the module, and only defer the rest).  So
>> this adds no complexity that did not already exist.
>>
>> The tracking of imports only needs to be done in the first pass.  They
>> are not needed after that, since the later pass does not use them.
>> The "lexically before" rule is rather easy to handle in this pass.  Do
>> a pass in lexical order, making symbols and import statements available
>> when their declarations are processed, and resolving names against these
>> available symbols and imports when each reference is processed.
>>
>> Steven Sharp
>> sharp@cadence.com
>>
>>
>




-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Tue Jan 13 21:01:30 2009

This archive was generated by hypermail 2.1.8 : Tue Jan 13 2009 - 21:02:49 PST