Re: [sv-bc] Resolving a forward typedef via a package import

From: Greg Jaxon <Greg.Jaxon_at_.....>
Date: Fri Sep 29 2006 - 00:36:23 PDT
As written, your suggestion both imports and locally declares
the same name:

import pkg1::*;
typedef   ab   ab;
// import ^^ & ^^ local decl

  so that's a collision.  You could write...

typedef pkg1::ab ab; // or
parameter cd = pkg::cd;  // or similarly
function automatic bit [7:0] ef( integer gh, ij );
   return pkg1::ef( gh, ij );
endfunction

because the content extractions do not add names to
the local scope.  This is how you'd have /rename/ imports
to workaround collision too.

... but this is tedious and error prone, and I haven't
considered the other entities that simulator packages
might want to chain.

Greg


Brad Pierce wrote:
> So, without 'export', I have to redeclare the type, even when I don't
> wish to alias it?
> 
>      package pkg1;
>        typedef struct {logic a, b;} ab;
>      endpackage
> 
>      package pkg2;
>        import pkg1::*;
>        typedef ab ab;  //<-----
>      endpackage
> 
>      module test(input a1, b1, output a2, b2);
>        import pkg2::*;
>        assign '{a2, b2} = ab'{a1, b1};
>      endmodule
> 
> -- Brad
> 
> -----Original Message-----
> From: Greg Jaxon [mailto:Jaxon@synopsys.COM] 
> Sent: Thursday, September 28, 2006 5:43 PM
> To: Gordon Vreugdenhil
> Cc: Brad Pierce; sv-bc@eda.org
> Subject: Re: [sv-bc] Resolving a forward typedef via a package import
> 
> This also makes me uneasy.
> 
> Consider the problem of establishing the unique identity
> of this type in the instantiation hierarchy.   I assume
> that a typedef forward can only be completed by a full typedef /in the
> same scope/, so that both have the same
> full hierarchical name.   If it helps to consider an
> implementation, imagine that the forward typedef actually produces the
> basic type identity sans structural info.
> References to the incomplete type may refer to this record location, and
> the completion simply fills in the details under the previously reserved
> identity.
> 
> An import affects the receiving scope like a declaration.
> But so does the forward typedef.  I say they collide and do not form a
> completed pair.
> 
> Greg
> 
> Gordon Vreugdenhil wrote:
>> I'm not quite sure that I buy your example.
>>
>> If you have:
>>    typedef ab;
>> ....
>>    import pkg1::ab;
>>
>> I can buy that as a completion of the forward, but what you are 
>> asserting is that the forward typedef is completed *upon its 
>> declaration* if the type is is a candidate from some package.
>>
>> That isn't an obvious conclusion from the text and is one that I am 
>> not sure I agree with.
>>
>> An implication of such a statement is that if ANY package has a 
>> visible type "T" then you can't forward declare "T"  even if your 
>> intent was to have the declaration complete locally.
>>
>> I would contend that the forward declaration does NOT count as a 
>> reference and the the completion must either be via an explicitly 
>> named import or by a subsequent typedef.
>>
>> So
>>    typedef ab;
>> ...
>>    typedef pkg1::ab ab;
>> would be fine as would my earlier example, but your example would not.
>>
>> Gord.
>>
>>
>> Brad Pierce wrote:
>>
>>> According to the final sentence of 4.9,
>>>
>>>    "Importing a typedef from a package into a local scope can also
>>>     resolve a type definition."
>>>
>>> It would be helpful to add an example of that, such as,
>>>
>>>     package pkg1;
>>>       typedef struct {logic a, b;} ab;
>>>     endpackage
>>>
>>>     package pkg2;
>>>       import pkg1::*;
>>>       typedef ab;
>>>     endpackage
>>>
>>>     module test(input a1, b1, output a2, b2);
>>>       import pkg2::*;
>>>       assign '{a2, b2} = ab'{a1, b1};
>>>     endmodule
>>>
>>> -- Brad
>>>
>>>
> 
> 
Received on Fri Sep 29 00:36:29 2006

This archive was generated by hypermail 2.1.8 : Fri Sep 29 2006 - 00:36:54 PDT