====== Type declarations ======
===== type_declaration =====
* full_type_declaration
* incomplete_type_declaration
===== Parents =====
* entity_declarative_part
* architecture_declarative_part
* package
* package_body
* block_declarative_part
* function_declarative_part
* procedure_declarative_part
* process_declarative_part
===== Further definitions =====
==== full_type_declaration ====
''type [[.:bnf#identifier]] is [[.:bnf#type_definition]] ;''
==== incomplete_type_declaration ====
''type [[.:bnf#identifier]] ;''
===== Examples =====
Two Integer types //A// and //B//, both of which have a range of 1 to 10, are declared.
TYPE A IS RANGE 1 TO 10 ;
TYPE B IS RANGE 1 TO 10 ;
----
The physical type //capacitance// is declared as a Real-type with a range of 0 to 1E16. Afterwards a base unit and units derived from it are declared.
TYPE capacitance IS RANGE 0 TO 1E16
UNITS
fF ; -- Femtofarad
pF = 1000 fF ; -- Picofarad
nF = 1000 pF ; -- Nanofarad
uF = 1000 nF ; -- Microfarad
END UNITS ;
----
A recursive structure is created. At first type //cell// is declared incompletely. As a consequence the access type //link// is declared on the type //cell// .
Afterwards type //cell// is declared completely as Record. The elements //succ// and //pred// are declared as index types. By doing so an interlinked list can be created in which every element receives an index to both its predecessor and its successor.
TYPE cell ;
TYPE link IS ACCESS cell ;
TYPE cell IS
RECORD
value : integer ;
succ : link ;
pred : link ;
END RECORD ;
----
These are examples of standard predefined types. //boolean// , //bit// and //character// are enumeration types.
//string// and //bit_vector// are arrays which can have any width (RANGE <>) with the maximum width being determined by the corresponding type ( //positive// , //natural// ).
TYPE boolean IS ( false, true ) ;
TYPE bit IS ( '0', '1' ) ;
TYPE string IS ARRAY (positive
RANGE <>) OF character ;
TYPE bit_vector IS ARRAY
(natural RANGE <>) OF bit ;