RE: [vhdl-200x] Bugzilla 289: Context declaration requirements are not uniform

From: Peter Flake <flake@elda.demon.co.uk>
Date: Thu Nov 07 2013 - 07:54:09 PST
Hi Daniel,

 

In section 13.2

If two or more logical names having the same identifier (see 15.4) appear in
library clauses in the same context clause, the second and subsequent
occurrences of the logical name have no effect.

 

Regards,

Peter.

 

From: owner-vhdl-200x@eda.org [mailto:owner-vhdl-200x@eda.org] On Behalf Of
Daniel Kho
Sent: 02 November 2013 14:04
To: vhdl-200x@eda.org
Subject: Re: [vhdl-200x] Bugzilla 289: Context declaration requirements are
not uniform

 

Typo corrected.

 

On 2 November 2013 22:00, Daniel Kho <daniel.kho@gmail.com> wrote:

Hi all,

In Section 13.2, the LRM states that:
"A given implementation shall provide some mechanism to associate a library
logical name with a host-dependent library. Such a mechanism is not defined
by the language."

I think this means that the same logical name should map to a unique
host-dependent physical library, even if there are multiple repeated
mentions of the same library clause. This leaves the design library unique
for the same library logical name.

I.e., the following _library_ clauses:
lib lib1;

lib lib1;

should point to the same physical design library "lib1".

 

Is there anywhere in the LRM that restricts such repeated library clauses?

 

regards, daniel

 

 

On 2 November 2013 17:52, Daniel Kho <daniel.kho@gmail.com> wrote:

Resending, as I believe the previous message wasn't registered.

 

 

---------- Forwarded message ----------
From: Daniel Kho <daniel.kho@tauhop.com>
Date: 2 November 2013 02:52
Subject: [vhdl-200x] Bugzilla 289: Context declaration requirements are not
uniform
To: "vhdl-200x@eda.org" <vhdl-200x@eda.org>



Hi all,

The submitter points us to Section 13.4 of the LRM:
"It is an error if, during analysis of a design unit, there is a library
clause in the expanded context clause of the design unit that occurs as part
of a replacement of a context reference, and a logical name in that library
clause denotes a different design library from the design library denoted by
the logical name during analysis of the context declaration from which the
library clause was expanded."

After reading this over and over a few times, I too have a few questions.

1) What is meant by "...from which the library clause was expanded."?

I'm guessing this may be a typo, and what was meant was indeed: "...from
which the context clause was expanded."

Or am I missing something?

 

2) Another thing that isn't very clear to me is this clause: "if...there is
a library clause in the expanded context clause of the design unit that
occurs as part of a replacement of a context reference..."

My view is that a library clause in the expanded context clause couldn't
possibly _replace_ a context reference. Even if the library clause
"replaces" part of the expanded context clause (taken from the context
declaration denoted by the selected name of the context reference in
question), it should not have any impact on the analysis of the design unit.


The same section of the LRM also mentions:
"NOTE 1-The rules given for use clauses are such that the same effect is
obtained whether the name of a library unit is mentioned once or more than
once by the applicable use clauses, or even within a given use clause."

I'm not sure if a similar rule applies to library clauses, but this seems to
imply so. If for example, the same library logical name is mentioned more
than once, the effect should be the same as if the library was only
mentioned once.

 

Consider the following example:

 

-- contexts c1 and c2 are compiled into the lib1 library:

context c1 is

    library lib1;

    context lib1.c2;
    ...

end context c1;

context c2 is

    library lib1;

    library lib2;
    ...

end context c2;

 

-- User design:

library lib1;

context lib1.c1;

 

The equivalent expanded context clause should look like this (repeated
library logical names are explicitly written as well):

library lib1;

library lib1;    -- [c1.lib1]: no issues, as this refers to the same design
library lib1.

library lib1;    -- [c2.lib1]: should also not be an issue? This should also
refer to the same design library lib1.

library lib2;    -- [c2.lib2]
...

 

I am guessing that what was really intended by the LRM was to say:
"if...there is a _use_ clause in the expanded context clause of the design
unit...".

The reason for my belief comes from my reasoning in 3).


3) The same sentence in the LRM goes on to say: "...and a logical name in
that library clause denotes a different design library from the design
library denoted by the logical name during analysis of the context
declaration..."

I'm not sure how two library clauses that have the same logical name can
possibly denote different design libraries? The library logical name has to
be unique, as far as I know.

Perhaps what was meant by the LRM was this:
"...and a selected name in that use clause denotes a different design
library from the design library denoted by the selected name during analysis
of the context declaration..."

 

This seems to support my reasoning in 2) that the LRM requires an error to
be issued when a use clause tries to replace part of the expanded context
clause for a design unit, AND the selected names for the conflicting use
clauses are referring to different design libraries.

For example, the following would result in an error (I'm just showing the
expanded context clause for more clarity):
library ieee, lib1;
use lib1.std_logic_1164.std_ulogic;
context lib1.ctx;    -- assume that the corresponding context declaration
contains "use ieee.std_logic_1164.std_ulogic"

entity someDesign is port(q:out std_ulogic); end entity someDesign;

 

This should result in an error, because although the selected name of the
use clauses are the same, they refer to different design libraries.

I suggest we re-word the LRM to the following:
"It is an error if, during analysis of a design unit, there is a use clause
in the expanded context clause of the design unit that occurs as part of a
replacement of a context reference, and a selected name in that use clause
denotes a different design library from the design library denoted by the
selected name during analysis of the context declaration from which the
context clause was expanded."

 

Or am I missing something else here?


The submitter also mentions:
"Consequently, the same context clause can refer to completely different
declarations."

I think it is fine for the same context clause to refer to different
declarations. If the same context clause is used in different designs, I
believe it is fine for the context clause to refer to different
declarations, it that is what is intended by the design?

For the submitter's case, if we want Design 2 to have y refer to l1.x.y, we
would need to specify the library l1 explicitly in the context declaration:

context c2 is

    library l1;

    use l1.x.y;

end context c2;

 

I think this is not a problem. If we want every design unit to have context
clauses that always point to the same declarations, then we should
explicitly specify the library clause within the context declaration.

Otherwise, if we want to allow different designs to use different libraries
for the same declaration, then we need not specify the library clause in the
context declaration. Different designs can then use the same context
reference in their context clauses, but each of those context clauses could
possibly refer to different design libraries.

I don't see an issue with this, or am I missing something?

 

I believe this is pretty similar to the following example:

 

-- Say we compiled our non-standard std_logic_1164 package into the "my_lib"
library:

package std_logic_1164 is
    type std_ulogic is ('a', 'b', 'c', 'd', true, false);
end package std_logic_1164;

package body std_logic_1164 is end package body std_logic_1164;



-- This context declaration is also compiled into the "my_lib" library:

context c1 is

    use std_logic_1164.std_ulogic;

end context c1;

-- Design 1:

library ieee;
use ieee.std_logic_1164;
context my_lib.c1;    -- equivalent to "use ieee.std_logic_1164.std_ulogic;"

entity design1 is port(q:out std_ulogic); end entity design1;

 

-- Design 2:

library my_lib;

use my_lib.std_logic_1164;

context my_lib.c1;    -- equivalent to "use
my_lib.std_logic_1164.std_ulogic;"

entity design2 is port(q:out std_ulogic); end entity design2;

 

Both designs use the same type names, but they are actually different types
that came from different libraries.

This could be intended by a real design as well, where a designer could
explicitly write the expanded context clauses in place of the context
clauses that contains context references (as in the comments above).

 

Comments?


Best regards,
Daniel

 

 

 


-- 
This message has been scanned for viruses and 
dangerous content by  <http://www.mailscanner.info/> MailScanner, 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 Nov 7 07:54:45 2013

This archive was generated by hypermail 2.1.8 : Thu Nov 07 2013 - 07:55:14 PST