Re: [sv-bc] RE: [sv-ec] overloading an assignment operator

From: Brad Pierce <Brad.Pierce_at_.....>
Date: Thu Apr 12 2007 - 12:41:29 PDT
An open Mantis item about operator overloading is
 
       http://www.eda-stds.org/svdb/bug_view_page.php?bug_id=0000699
 
This item regards the test used for selecting a function -- type
matching or type equivalence?

An example of where this matters would be operands that are unpacked
arrays of packed structs vs. operands that are unpacked arrays of bit
vectors of an equivalent type.
 
         typedef struct packed {
           bit sign;
           bit [3:0] exponent;
           bit [10:0] mantissa;
         } T1;

         typedef bit [$bits(T1)-1:0] T2;

         typedef T1 A_T1[16];
         typedef T2 A_T2[16];

The types A_T1 and A_T2 are equivalent, but

       type(A_T1) != type(A_T2)

In my opinion, matching is used, and if you wanted + to be applicable to
any combination of A_T1 and A_T2 operands, you'd need --

       bind + function A_T1 f11(A_T1, A_T1);
       bind + function A_T1 f12(A_T1, A_T2);
       bind + function A_T1 f21(A_T2, A_T1);
       bind + function A_T1 f22(A_T2, A_T2);

-- Brad

________________________________

From: owner-sv-bc@eda.org [mailto:owner-sv-bc@eda.org] On Behalf Of
Rich, Dave
Sent: Thursday, April 12, 2007 11:54 AM
To: sv-bc@eda-stds.org
Subject: RE: [sv-bc] RE: [sv-ec] overloading an assignment operator



I meant for the purpose of overloading, the '=' assignment is considered
a unary operator, like unary +. Also, section 8.16 considers += as two
independent operators, even though it's considered a binary operator
elsewhere.

 

Calling this feature operator overloading is a misnomer. It's really
function binding for undefined operators; a requirement that came from
synthesis, not OOP.

 

I'm assuming that it would be an error to specify the incorrect number
of arguments for the operator you are binding to.

 

Dave

 

 

 

 

________________________________

From: Subhamoy Pal [mailto:spal@Magma-DA.COM] 
Sent: Thursday, April 12, 2007 11:16 AM
To: Rich, Dave; Steven Sharp; sv-ec@eda-stds.org; sv-bc@eda-stds.org
Subject: RE: [sv-bc] RE: [sv-ec] overloading an assignment operator

 

Hi Dave,

 

Back to my original queries I will like to ask you something.

 

You said, "The LRM considers assignment a unary operator". Can you
please point me any LRM verse to support this? I really did not find
assignment operator either in unary operators' list or in binary
operators' list. Else we can think LRM is not clear about this. In C++
and C, assignment operator is binary operator, based on which SV defines
assignment operators such as "+=", ">>>=" etc.

 

Second query is does LRM pose any restriction on the no of arguments of
the bounded function for unary or binary operator? It does not. So I can
bind a function with 2 arguments to a unary operator or can bound a
function with 1 argument to a unary operator. Here also I just like to
mention C, C++ explicitly specifies the no of arguments to have a
function when to use it for overloading an operator.

 

Thanks,

Subhamoy

 

________________________________

From: Rich, Dave [mailto:Dave_Rich@mentor.com] 
Sent: Thursday, April 12, 2007 11:24 PM
To: Subhamoy Pal; Steven Sharp; sv-ec@eda-stds.org; sv-bc@eda-stds.org
Subject: RE: [sv-bc] RE: [sv-ec] overloading an assignment operator

 

Subhamoy,

 

It looks like you've answered your own question. The LRM considers
assignment a unary operator. So the statement

 

    out1  = (temp = in);

 

is really two unary assignments. The first is an assignment from an int
to complex. The second assignment is the result of the previous
assignment, which is a complex type, to another complex type. So you can
only overload the assignment from int to complex, since complex to
complex is already defined. That overloading function would look like:

 

function complex assgn(int i);

    assgn.Real = i;

    assgn.imaginary = 0;

endfunction

 

 

 

________________________________

From: owner-sv-bc@server.eda.org [mailto:owner-sv-bc@server.eda.org] On
Behalf Of Subhamoy Pal
Sent: Thursday, April 12, 2007 10:34 AM
To: Steven Sharp; sv-ec@server.eda-stds.org; sv-bc@server.eda-stds.org
Subject: [sv-bc] RE: [sv-ec] overloading an assignment operator

 

Hi Steven,

 

SV LRM 8.16 has these lines.

================

Overloading the assignment operator also serves to overload implicit
assignments or casting. Here these are

using the same functions as the unary +.

bind = function float fcopyi(int); // cast int to float

bind = function float fcopyr(real); // cast real to float

bind = function float fcopyr(shortreal); // cast shortreal to float

 

So it means LRM gives provision for overloading assignment.

 

Thank,

Subhamoy

 

-----Original Message-----
From: Steven Sharp [mailto:sharp@cadence.com] 
Sent: Thursday, April 12, 2007 10:55 PM
To: sv-ec@eda-stds.org; sv-bc@eda-stds.org; Subhamoy Pal
Subject: Re: [sv-ec] overloading an assignment operator

 

The LRM lists the operators that can be overloaded, and it does not

include assignment.  There is other text that indicates that this

was not an oversight.  The LRM only allows overloading of operators

when applied to data types that would otherwise be illegal for them.

Assignment is legal for all data types.  The LRM also explicitly talks

about arithmetic operators, which does not include assignment.  So it

seems quite clear that an assignment operator cannot be overloaded.

 

Steven Sharp

sharp@cadence.com

 


-- 
This message has been scanned for viruses and 
dangerous content by MailScanner <http://www.mailscanner.info/> , and is

believed to be clean. 
-- 
This message has been scanned for viruses and 
dangerous content by MailScanner <http://www.mailscanner.info/> , and is

believed to be clean. 

-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Thu Apr 12 12:41:48 2007

This archive was generated by hypermail 2.1.8 : Thu Apr 12 2007 - 12:42:01 PDT