SV-XC opaque type requirements

From: John Shields <John_Shields_at_.....>
Date: Tue Sep 04 2007 - 17:34:16 PDT
Hi,

In SV-XC discussions, there has been a suggestion that it would be 
valuable if the languages supported an opaque type such that mixed 
language connections could be made from a concrete type in one language 
that has no representation in the other language.  While no operations 
could be done with an object of an opaque type except "connection", it 
could eventually be connected to a child instance in the language of the 
original concrete type( or any other language for which a compatible 
type exists).   This document elaborates on the idea and its 
implications, so that we may consider whether this should be an SV-XC 
requirement and whether more detailed work should be taken up.

Background
----------

Based on our current SV-XC requirements and an understanding of the type 
system in SV, VHDL, and SC, it is clear there are going to be 
incompatible types of objects between the languages.  One very 
reasonable model of handling them is to say that incompatible types just 
can't appear at the language boundary.  If there is a need to do so, 
then the owner of the object must convert the type in some user-defined, 
application specific manner to a compatible type.  The benefit of that 
conversion includes the ability to work with the converted compatible 
type, to read/write its value, perform operations on the data, etc.  The 
compromise is that there will likely be loss of information in the 
conversion, or loss of ability to maintain invariants supported by the 
original type.  A good example might be a class in SV converted to a 
record in VHDL by copying data members.  In SV, I could only affect the 
object through its public methods, which may guarantee some relationship 
between values of data members is never violated.  In VHDL, I can break 
that relationship capriciously.  Of course, I could do a "good job" of 
providing a functional interface to the record that helped maintain 
semantic invariants of the original class, too.  Regardless it is no 
longer a natively supported invariant of the type.
  
The fact that incompatible types can't appear at the language boundary 
is the status-quo for SV-XC and the compromise it presents is reasonable.

Is it acceptable to say that incompatible types just can't appear at the 
language boundary?  If so, the only way left to deal with them is to 
extend the type systems appropriately so that more compatibility between 
types is enabled.  That is a difficult, long lead time proposition at 
best, but certainly it is possible and will happen over time for some 
important types.  What if it were possible to declare a type that was 
compatible with any type, but only with a use model restricted to 
propagating connections through the design hierarchy? The first question 
is whether there are important use cases that such a feature would enable.

An Important Use Case
---------------------
Consider a case where a SV design unit wishes to pass a class object 
down the hierarchy to leaf level SV instances.  If there is any 
intermediate VHDL models through which this must be passed, they may 
have no need to interact with that object, but they would have a 
responsibility to pass it through the hierarchy to their children.  If 
they do need to interact with it, they will need an SV child instance to 
accept it and convert it to something they can handle. But regardless, 
they still need to pass it further down the hierarchy with its full 
semantic meaning and integrity. (I'll note the use case may also exist 
in scenarios with SV/SC and SC-VHDL).

Is this an important use case?  One conceptual model for it may be an 
environment class that all objects interacting with a testbench must 
have.  An oft used model for access in Verilog is hierarchical reference 
and it is unclear when such an object must really be passed through the 
model hierarchy.  Let's assume this is an important case.

If anyone would care to elaborate on this or other use cases that are 
expected to be important, it will help with the evaluation of the opaque 
type requirement.  This will be a critical aspect of gaining support 
even if SV-XC itself needs no further convincing.


Analysis and Elaboration Considerations
---------------------------------------

Let us begin with the idea that only a formal port may be declared to be 
of an opaque type.  It can only be referenced as the actual connection 
to another formal port in an instantiation statement.  You may connect 
any object to this opaque formal port in a parent's instantiation 
statement including another opaque formal port.  You may connect an 
opaque formal port to another design unit port of any type.

One can say a simple thing about such an opaque typed object.  It must 
convey a reference to an object through the hierarchy such that when an 
opaque port that is connected to a concrete object above it in the 
hierarchy is finally connected to another concrete port below it, the 
final port is fully aware of all the details of the concrete object it 
is connected to.  The connection of the two actual typed objects 
involved must be semantically valid. Is that enough?

What happens when a concrete typed object, the actual or hiconn, from 
language A is passed to an opaque typed port, the formal or lowconn, of 
language B.  The instantiation statement is written in language A. What 
are the analysis considerations in language A?

In elaborated design, the concrete actual may be conveyed by value or by 
reference, depending on its type.  It may only be read or provide values 
(e.g., current value and driving value of a signal), depending on its 
type and object kind, or it may be written or driven. If the concrete 
actual may only be read, analysis can recognize an illegal connection to 
a formal port when that port declares a direction, out or inout, 
implying that it will write a value or drive a signal.  There is a 
similar case when the actual may only be written.  There are potential 
restrictions on the number of writers.  An unresolved signal in VHDL may 
only have one writer, for example.

In general, where the formal port indicates how it will access an actual 
connected to it and when the actual has access restrictions, there is a 
semantic analysis that must take place to determine correctness.  If 
language A requires the prototype of the design unit to be visible for 
such analysis, it is an analysis time semantic check.  If not, it is an 
elaboration time semantic check.  Even if it is an elaboration time 
check, a further consideration is whether the semantic analysis is 
expected to be local or global across the design hierarchy.  By local, 
it is meant that the actual object type and kind and the formal port 
type and kind it is connected to have enough information to perform a 
semantic check.  By global it is meant that the entire hierarchical 
structure of the connections that make up this net must be elaborated 
before the semantic check can be made.  Many of these port connection 
rules checked at elaboration are expected to be local and arguably will 
benefit from being local.

What happens when a opaque typed object, the actual or hiconn, from 
language B is passed to an concrete typed port, the formal or lowconn, 
of language A.  The instantiation statement is written in language B. 
What are the analysis considerations in language B?

It is really not conceptually different from the first case.  The formal 
is a concrete type which indicates direction, pass by value of reference 
semantics, signal or variable semantics, and associated connection 
rules. You know little about the actual (as we've defined things so far 
anyway). The first case was just the reverse. You can't do analysis 
until you know something about the opaque type or the context of the 
object that has that type.  So far, one may never know enough at 
analysis time and at elaboration time whatever you need to know may 
depend on non-local information. 

I suggest that is an unacceptable scenario.  If we follow our existing 
requirements, we do not intend to define an SV-XC specification that 
requires change to the model of analysis and elaboration in existing 
languages.  We further wish to guarantee strong typing rules across 
languages will not be weakened by virtue of mixed language connections.  
Some of these semantic checks are done at analysis time or as local 
elaboration analysis.  In particular, VHDL defines a one pass 
elaboration model that would expect connection rules to be checked locally.

This is not a proposal for how to declare and opaque port types in SV, 
VHDL, and SC, but an exploration of requirements. Such a proposal is 
required to convey information that would support local checking of pass 
by value or reference semantics, signal or variable semantics, and 
associated connection rules for multiplicity and access restriction.

Let's now expand on the initial idea and consider allowing local 
declarations of opaque objects.  What is the use case for a locally 
declared opaque object?  The implication is that you would have to be 
able to initialize it and/or assign a value to it.  If the proposition 
is that an opaque type is intended to be a reference to a type 
unrepresentable in the language, then a locally declared opaque type 
object would ultimately receive its value by assignment from an opaque 
type port.  Is that valuable?  One could assign an opaque type object to 
another opaque type object. Ultimately, one would make a port connection 
of that opaque type object.  Are there any other valid operations on an 
opaque object?  I would suggest there are not.  The only operations that 
would be valid are ones on the underlying concrete type and such 
operations exist only in the language of the concrete type, not the 
language where the opaque object is declared.  In fact, I suggest the 
assignment to a local opaque object would only have the semantics of a 
port connection. Indeed, the semantics checks of the validity of the 
assignment, e.g., whether an opaque object can be validly read or 
written, is analogous to semantic checks on whether a port connection is 
valid or not.  Such checks are typically made at analysis time and would 
require additional information defined in the declaration of the opaque 
typed object to support it.

Now it is possible that a language would define its opaque type such 
that an object of a concrete type in the same language could be 
connected to it. What is the use case for that? Whatever it is, could it 
not be satisfied by parameterized types?  For that matter, what does 
that use case have to do with mixed language needs?  I suggest that this 
is not a requirement for mixed language specification, but may happen to 
fall out of adding opaque types as another implication.  
 

Other Implications
------------------

It is important to say explicitly that opaque types are an extension to 
each language.  If language A wishes to pass an unrepresentable type 
through language B, it is language B that must add a opaque type to its 
language and define the supporting connection rules.  In addition, SV-XC 
specifications for language A instantiation of a design unit in language 
B must state the validity of connections of objects of its concrete 
types to B's opaque type port and define mixed language connection rules 
of its own, as appropriate.

Language B may have its own additional considerations for an opaque type 
that transcend this mixed language issue.  An example is VHDL-AMS has a 
desire to support the ability to exchange an a design unit that is a 
discrete model abstraction (i.e., a pure digital model), for its 
equivalent one modeled as a continuous abstraction(i.e., an analog or 
mixed signal model). If it were true that the entity declaration of the 
2 models was the same, and the architecture representing each model is 
where all the differences are, it is a trivial use case.  If the 
differences appear as ports that are signals in one case and terminals 
or quantities in the other, this involves rewrite of the instantiation.  
There is a desire in VHDL-AMS to have a "wire" port that would allow any 
kind of connection. At elaboration, the final nature of the net and the 
insertion of conversions (D2A or A2D) would be handled.

Language B may wish to restrict the use of opaque types so that they 
only apply to a foreign connection or allow opaque types to be more 
broadly used within the language.  Such considerations are not part of 
the basic use case that SV-XC wishes to enable and are not requirements 
that SV-XC will make on SV, VHDL, or SC.

The point is that the standards group responsible for the specific core 
language need to be presented with only the essential mixed language 
requirements and, most likely, a straw proposal for an opaque type for 
its consideration.  It would be very useful for those requirements to 
include the use cases intended to be satisfied by the result.


Proposed General Requirements for Opaque Type Support
-----------------------------------------------------

For SV, VHDL, and SC, the following general requirements apply to 
support connections through a mixed language design hierarchy where the 
type of the object being passed through the design hierarchy cannot be 
represented in the language of one of the design instances:

*the ability to declare a port of an opaque type for a design unit that 
would accept a connection to an object of any type.

*the ability to declare a local object of an opaque type and initialize 
it from another compatible object of an opaque type.
 
*the ability to assign an object of an opaque type to/from another 
compatible object of a opaque type, subject to locally checkable 
constraints.
In other words, not only are the final concrete type of both objects 
involved with not

*the ability to connect an object of an opaque type to a compatible port 
of an opaque type.

*the ability to complete a connection across design hierarchy from an 
object of some concrete type to another object of a compatible type, 
where the intermediate ports involved in the connection are of an opaque 
type.

*the continued ability to check the correctness of a connection of an 
object to a port locally at the point where the declarations of the 
object and port are known according to the language in which the 
instantiation appears.  That is a mouthful, but the point is that even 
if the type of the object and/or port is opaque, some basic connection 
rules should be checkable. These include direction of and multiplicity 
of assignment,  pass by reference or value semantics.  The fundamental 
idea is serious structural flaws normally checked locally at analysis 
time or at elaboration based on local information about the structure 
continue to be checkable locally.

*In no case do the semantics of connections rules in a language lead to 
erroneous designs because they can no longer be enforced when opaque 
type objects are involved.
 
*No operations or reading/writing of the "value" or properties of an 
object of an opaque type are possible other than port connection or 
assignment of one opaque type object to another compatible opaque type 
object.

*It shall be illegal to cast an object of an opaque type to a specific 
concrete type.  The rationale is that this either allows operations  
which may be semantically invalid or amounts to RTTI of an equivalent 
type in the language where the cast operation takes place.  This 
conflicts with underlying essence of the opaque type which is intended 
to allow conveying unrepresentable types across the design hierarchy.

*the opaque type does not imply that objects of any kind may now be 
connected to ports.  In language A, if you cannot connect a variable to 
a port because ports can only be signals, well, you still can't connect 
a variable to a port in an instantiation statement in language A.  It 
does not matter that the port is an opaque type.  This mechanism does 
not allow you to connect a variable of a concrete type in language A 
through the hierarchy via opaque port types to a variable of a 
compatible type in language A.  You never could pass variables through 
ports in language A and you still can't.


Further Action
--------------

It is not clear yet that an opaque type can be added to one language 
without considering the individual connections rules of all three of 
these languages together first.

A proposal for a specific language addition of the opaque type must 
analyze all the existing connection rules in that language associated 
with ports to determine what information must be declared for a port of 
an opaque type to support semantic checks at the instantiation boundary. 
In addition, a detailed requirement associated with a connection in a 
foreign language may require addition information about a port of an 
opaque type.

The required information may be conveyed syntactically by existing 
grammar, e.g., port direction, or may be added though additional port 
attributes or as the result of defining multiple opaque types that imply 
the desired information.

If any connection rule implies that information that qualifies the 
opaque type must come from the foreign language, this detailed 
requirement must be forwarded to that language.


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Tue Sep 4 17:34:44 2007

This archive was generated by hypermail 2.1.8 : Tue Sep 04 2007 - 17:34:56 PDT