Search code examples
syntaxvhdl

Why is there an apostrophe before a parenthesis in this VHDL function?


I'm new to coding test benches and so there is a lot of new syntax for me to learn. I'm stuck on trying to understand what the apostrophe after "string" is indicating.

It doesn't appear to be an attribute from here. Also, I've never seen a parenthesis after an apostrophe in VHDL.

    procedure Shrink_line(L : inout LINE; pos : in integer)
is 
    variable old_L : LINE := L;
begin
    if pos > 1 then
        L := new string'(old_L(pos to old_L'high));
        Deallocate(old_L);
    end if;
end;

Solution

  • It's a qualified expression.

    IEEE Std 1076-2008, 9.3.5 Qualified expressions:

    A qualified expression is a basic operation (see 5.1) that is used to explicitly state the type, and possibly the subtype, of an operand that is an expression or an aggregate."

    qualified_expression ::=
           type_mark ' ( expression )
         | type_mark ' aggregate

    This qualified expression states both the type and the subtype for the allocator (9.3.7 Allocators) assigned to L in the procedure.

    The operand of the qualified expression is the expression old_L(pos to old_L'high).

    It's not an aggregate, it doesn't use named association to distinguish it from a parenthesized expression having a single choice (9.3.3 Aggregates).

    Because you're not using a reference covering expressions you may not be aware what this allocator can do. Creating an MCVE:

    use std.textio.all;
    
    entity foo is
    end entity;
    
    architecture fum of foo is
    
        procedure Shrink_line(L : inout LINE; pos : in integer) 
        is 
            variable old_L : LINE := L;
        begin
            if pos > 1 then
                L := new string'(old_L(pos to old_L'high));
                Deallocate(old_L);
            end if;
        end;
    
    begin
        process
            variable L: LINE;
        begin
            write (L, string'("...shrinking violet"));
            Shrink_line(L, 14);
            writeline(OUTPUT,L);
            wait;
        end process;
    end architecture;
    

    Running this code in a simulation provides an output:

    ghdl -a foo.vhdl
    ghdl -e foo
    ghdl -r foo
    violet

    The output comes from the writeline to OUTPUT (which is the File STD_OUTPUT (stdout in POSIX parlance).

    9.3.7 Allocators, para 2:

    The type of the object created by an allocator is the base type of the type mark given in either the subtype indication or the qualified expression. For an allocator with a subtype indication, the initial value of the created object is the same as the default initial value for an explicitly declared variable of the designated subtype. For an allocator with a qualified expression, this expression defines the initial value of the created object.

    Creating the new allocator with a subtype constraint from the old allocator copied the string from the old allocator starting at position pos.

    One other thing to note is that a string left bound is 1 by default. Shrink_line counted on that.