====== Subprogram body ======
===== subprogram_body =====
subprogram_specification is
subprogram_declarative_part
begin
subprogram_statement_part
end [ subprogram_kind ] [ designator ] ;
===== Parent =====
* entity_declarative_part
* architecture_declarative_part
* package
* package_body
* block_declarative_part
* process_declarative_part
===== Further definitions =====
==== subprogram_specification ====
''procedure [[.:bnf#designator]] [ ( [[.:bnf#formal_parameter_list]] ) ]''
''[ pure | impure ] function [[.:bnf#designator]] [ ( [[.:bnf#formal_parameter_list]] ) ]'' \\
''return [[.:bnf#type_mark]]''
==== subprogram_declarative_part ====
''{ [[.:bnf#subprogram_declarative_item]] }''
==== subprogram_statement_part ====
''{ [[.:bnf#sequential_statement]] }''
==== subprogram_kind ====
* procedure
* function
==== designator ====
* [[.:bnf#identifier]]
* [[.:bnf#operator_symbol]]
===== Comment =====
* The declaration of a subprogram is optional. The subprogram specification can act as the declaration.
* //Shared variables// must not be declared in subprograms.
* A "foreign subprogram" is a subprogram with the attribute **FOREIGN** . The value of the attribute (a string) can contain implementation specific information for linking the external program (see example below).
* A pure function must not contain a reference to an explicitly declared file object.
* A pure function must not be the parent of an impure function.
===== Examples =====
Definition of the procedure //thank_you// .
If the condition //false// is not fulfilled "Thank You !" is reported as //note// in the severity level.
PROCEDURE thank_you IS
BEGIN
ASSERT false
REPORT "Thank You !"
SEVERITY note ;
END thank_you ;
----
Definition of the function //convert// with the transfer value //B// and the result type //fuzzy_bit// .
In the If-loop the variable //v// is assigned the value High or Low depending on the value of //B// .
//v// is transferred as transfer value.
FUNCTION convert(B : Bit ) RETURN fuzzy_bit IS
VARIABLE v : fuzzy_bit ;
BEGIN
IF B = '1' THEN
v := High ;
ELSE
v := Low ;
END IF ;
RETURN v ;
END convert ;
----
Definition of the procedure //regist// with the transfer values of the signals //D// , //CK// and //Q// .
Within the endless loop (LOOP) a register is declared which takes on the value of input //D// from output //Q// at the positive clock-edge with a delay of 1 ns.
PROCEDURE regist(
SIGNAL D : IN Bit ;
SIGNAL CK : IN Bit ;
SIGNAL Q : OUT Bit ) IS
BEGIN
LOOP
WAIT ON CK ;
IF CK = '1' THEN
Q <= D AFTER 1 ns ;
END IF ;
END LOOP ;
END regist ;
----
Definition of the procedure //p//; transfer values of the variable //COL// and the constant //C// .
The subtype //primary_color// is declared from the type //colour// with a range of //yellow// to //red// (from the enumeration type //colour// ). The variables //X// , //Y// and //Z// are declared.
PROCEDURE p(
VARIABLE COL : INOUT color ;
CONSTANT C : IN choice ) IS
SUBTYPE primary_color IS
color RANGE yellow TO red ;
VARIABLE X, Y, Z : primary_color ;
BEGIN
...
...
END p ;
----
The external function //exfunc// is declared.
The attribute //FOREIGN// of //exfunc// gets (simulator-) program specific information.
FUNCTION exfunc RETURN INTEGER ;
ATTRIBUTE FOREIGN OF exfunc FUNCTION
IS "C:modellib.so.0.1 ELAB:mod_lab";