Re: [sv-ec] classes questions

From: Gordon Vreugdenhil <gordonv_at_.....>
Date: Wed Oct 18 2006 - 08:07:02 PDT
Oh, one important detail here.

Given:
    class C #(int p = 1);
       extern task t();
    endclass

    task C::t();
    endtask

It is important to distinguish that such a reference
is NOT a reference to the default specialization but
is actually part of the unspecialized parameterized class.

Gord.

Gordon Vreugdenhil wrote:

> 
> Brad Pierce wrote:
> 
>> Gord,
>>
>>
>>> The grammar actually requires a "class_identifier" as the prefix of
>>
>>
>> "::".
>>
>> Where does the grammar do this?  The BNF doesn't. Do you mean the
>> unboxed text in the first paragraph of 7.21?  
> 
> 
> Yes.  I didn't check that with the full grammar which does allow
> the more general form.  So C#(1)::x is allowed.  Given that,
> treating C::x as a reference into the default specialization
> is quite reasonable.
> 
> 
>>
>> The BNF does not even support the example on the next page
>>
>>     Base::print( Base::hex, 66 );
> 
> 
> 
> Hmm - apparently this was overlooked wasn't it.  method_call
> covers all the non-static cases, but not the static cases.
> It looks like ps_or_hierarchical_tf_identifier should just have
> a class_scope variant added to it.
> 
> 
>> For consistency with the rest of the BNF, I'd expect that a static
>> method or class property could be prefixed with any class_scope.
> 
> 
> Static class properties are covered I think.  A primary is
> permitted to have a class_scope before the "hierarchical_identifier"
> portion of the name.  Blocking assignments are also covered.
> 
> Gord
> 
>> Following is the BNF for class_scope --
>>
>>    class_scope ::= class_type ::
>>
>>    class_type ::=  ps_class_identifier [ parameter_value_assignment ]
>>                       { :: class_identifier [ parameter_value_assignment
>> ] }
> 
> 
> 
> 
>> -- Brad
>>
>> -----Original Message-----
>> From: owner-sv-ec@eda.org [mailto:owner-sv-ec@eda.org] On Behalf Of
>> Gordon Vreugdenhil
>> Sent: Tuesday, October 17, 2006 9:20 PM
>> To: Arturo Salz
>> Cc: Francoise Martinolle; sv-ec@eda.org
>> Subject: Re: [sv-ec] classes questions
>>
>> Arturo,
>>
>> I am somewhat Ok with allowing things like C::x, but in our experience,
>> users have had more difficulty in distinguishing that C::x does NOT mean
>> "the only x in the type C" but rather that it means "the x in the type
>> created by a default specialization of C".  This tends to be less an
>> issue when using C explicitly in a type construction context.
>>
>> The grammar actually requires a "class_identifier" as the prefix of
>> "::".  I think there is a distinction in that allowing "C::x" confuses
>> the idea of "class type" and "parameterized class as a type
>> constructor".
>>
>> Our basic approach so far has been to allow a default specialization
>> only in a context in which an explicit specialization would be
>> permitted.  Since the current BNF doesn't allow C#(1)::x, we don't allow
>> C::x.  Since the BNF does allow any of:
>>     typedef C#(1) C_1_type;
>>     C#(1) some_obj;
>>     class D extends C#(1); .... endclass; (and a few others), we allow
>> default specialization in those contexts.
>>
>> This was an LRM interpretation judgement call; I would certainly be in
>> favor of a clarification here.
>>
>> If we would allow explicit specialization in any of the other contexts,
>> I'd be more amenable to allowing implicit specialization as well even
>> though I think that allowing it can be quite confusing.
>>
>> Gord.
>>
>>
>> Arturo Salz wrote:
>>
>>
>>> Gord,
>>>
>>> I agree with most of what you wrote. But, I disagree with your last
>>> statement:
>>>
>>> Given the declaration:
>>>
>>>    class C #(int p = 1);
>>>       static int x = p;
>>>    endclass
>>>
>>> Then C::x does indeed mean "the x in the type created by the default 
>>> specialization". Otherwise, what's the point of providing a default 
>>> parameter?
>>> Why would you allow     typedef C xyz;    // this does mean the 
>>> default specialization
>>> But not allow C::x ? BTW, what about the form "C()::x"? That is very 
>>> clear that it means the default specialization.
>>>
>>> Another question regarding this is:
>>>
>>>    class D #(int p = 1);
>>>       enum Bool { FALSE, TRUE = p };
>>>    endclass
>>>
>>> Would you disallow "D::Bool" , but allow "typedef X D::Bool" ?
>>>
>>> I would agree with your assessment if Brad's proposal to omit default 
>>> types passes and the parameterized class were written with no default.
>>>
>>>     Arturo
>>>
>>
>> -- 
>> --------------------------------------------------------------------
>> 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 Wed Oct 18 08:07:09 2006

This archive was generated by hypermail 2.1.8 : Wed Oct 18 2006 - 08:07:37 PDT