aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth/elab-vhdl_context.ads
diff options
context:
space:
mode:
Diffstat (limited to 'src/synth/elab-vhdl_context.ads')
-rw-r--r--src/synth/elab-vhdl_context.ads222
1 files changed, 222 insertions, 0 deletions
diff --git a/src/synth/elab-vhdl_context.ads b/src/synth/elab-vhdl_context.ads
new file mode 100644
index 000000000..2fc483c7f
--- /dev/null
+++ b/src/synth/elab-vhdl_context.ads
@@ -0,0 +1,222 @@
+-- Synthesis context.
+-- Copyright (C) 2017 Tristan Gingold
+--
+-- This file is part of GHDL.
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <gnu.org/licenses>.
+
+with Vhdl.Annotations; use Vhdl.Annotations;
+with Vhdl.Nodes; use Vhdl.Nodes;
+
+with Elab.Vhdl_Objtypes; use Elab.Vhdl_Objtypes;
+with Elab.Vhdl_Values; use Elab.Vhdl_Values;
+
+package Elab.Vhdl_Context is
+ -- Values are stored into Synth_Instance, which is parallel to simulation
+ -- Block_Instance_Type.
+
+ type Synth_Instance_Type (<>) is limited private;
+ type Synth_Instance_Acc is access Synth_Instance_Type;
+
+ Root_Instance : Synth_Instance_Acc;
+
+ -- Unique per instance id. Used to create parallel tables.
+ type Instance_Id_Type is new Natural;
+ First_Instance_Id : constant Instance_Id_Type := 1;
+
+ function Get_Instance_Id (Inst : Synth_Instance_Acc)
+ return Instance_Id_Type;
+ pragma Inline (Get_Instance_Id);
+
+ function Get_Instance_By_Scope
+ (Syn_Inst: Synth_Instance_Acc; Scope: Sim_Info_Acc)
+ return Synth_Instance_Acc;
+
+ -- Create the root instance (which contains the packages).
+ -- Assign ROOT_INSTANCE.
+ procedure Make_Root_Instance;
+
+ -- Free the first instance.
+ procedure Free_Base_Instance;
+
+ -- Create and free the corresponding synth instance.
+ function Make_Elab_Instance
+ (Parent : Synth_Instance_Acc; Blk : Node; Config : Node)
+ return Synth_Instance_Acc;
+
+ procedure Free_Elab_Instance (Synth_Inst : in out Synth_Instance_Acc);
+
+ function Make_Elab_Generate_Instance
+ (Parent : Synth_Instance_Acc; Blk : Node; Config : Node; Len : Natural)
+ return Synth_Instance_Acc;
+
+ function Get_Generate_Sub_Instance
+ (Parent : Synth_Instance_Acc; Idx : Positive) return Synth_Instance_Acc;
+ procedure Set_Generate_Sub_Instance
+ (Parent : Synth_Instance_Acc; Idx : Positive; Child : Synth_Instance_Acc);
+
+ function Is_Error (Inst : Synth_Instance_Acc) return Boolean;
+ pragma Inline (Is_Error);
+
+ procedure Set_Error (Inst : Synth_Instance_Acc);
+
+ function Get_Instance_Const (Inst : Synth_Instance_Acc) return Boolean;
+ procedure Set_Instance_Const (Inst : Synth_Instance_Acc; Val : Boolean);
+
+ -- Get the corresponding source for the scope of the instance.
+ function Get_Source_Scope (Inst : Synth_Instance_Acc) return Node;
+
+ procedure Set_Instance_Config (Inst : Synth_Instance_Acc; Config : Node);
+ function Get_Instance_Config (Inst : Synth_Instance_Acc) return Node;
+
+ -- Add/Get extra instances.
+ -- Those instances are verification units.
+ procedure Add_Extra_Instance (Inst : Synth_Instance_Acc;
+ Extra : Synth_Instance_Acc);
+ function Get_First_Extra_Instance (Inst : Synth_Instance_Acc)
+ return Synth_Instance_Acc;
+ function Get_Next_Extra_Instance (Inst : Synth_Instance_Acc)
+ return Synth_Instance_Acc;
+
+ procedure Create_Object
+ (Syn_Inst : Synth_Instance_Acc; Decl : Node; Vt : Valtyp);
+
+ procedure Create_Signal (Syn_Inst : Synth_Instance_Acc;
+ Decl : Node;
+ Typ : Type_Acc;
+ Init : Value_Acc);
+
+ -- Create a sub instance: either a direct entity instantiation, or
+ -- a component instantiation.
+ procedure Create_Sub_Instance (Syn_Inst : Synth_Instance_Acc;
+ Stmt : Node;
+ Sub_Inst : Synth_Instance_Acc);
+
+ -- Create a sub instance for a component.
+ procedure Create_Component_Instance (Syn_Inst : Synth_Instance_Acc;
+ Sub_Inst : Synth_Instance_Acc);
+
+ procedure Create_Package_Object (Syn_Inst : Synth_Instance_Acc;
+ Decl : Node;
+ Inst : Synth_Instance_Acc;
+ Is_Global : Boolean);
+
+ function Create_Package_Instance (Parent_Inst : Synth_Instance_Acc;
+ Pkg : Node)
+ return Synth_Instance_Acc;
+
+ procedure Create_Package_Interface (Syn_Inst : Synth_Instance_Acc;
+ Decl : Node;
+ Inst : Synth_Instance_Acc);
+
+ procedure Create_Subtype_Object
+ (Syn_Inst : Synth_Instance_Acc; Decl : Node; Typ : Type_Acc);
+
+ -- Force the value of DECL, without checking for elaboration order.
+ -- It is for deferred constants.
+ procedure Create_Object_Force
+ (Syn_Inst : Synth_Instance_Acc; Decl : Node; Vt : Valtyp);
+
+ procedure Replace_Signal
+ (Syn_Inst : Synth_Instance_Acc; Decl : Node; Vt : Valtyp);
+ procedure Mutate_Object
+ (Syn_Inst : Synth_Instance_Acc; Decl : Node; Vt : Valtyp);
+
+ procedure Destroy_Object
+ (Syn_Inst : Synth_Instance_Acc; Decl : Node);
+
+ -- Get the value of OBJ.
+ function Get_Value (Syn_Inst : Synth_Instance_Acc; Obj : Node)
+ return Valtyp;
+
+ function Get_Package_Object
+ (Syn_Inst : Synth_Instance_Acc; Pkg : Node) return Synth_Instance_Acc;
+
+ -- Return the type for DECL (a subtype indication).
+ function Get_Subtype_Object
+ (Syn_Inst : Synth_Instance_Acc; Decl : Node) return Type_Acc;
+
+ function Get_Sub_Instance
+ (Syn_Inst : Synth_Instance_Acc; Stmt : Node) return Synth_Instance_Acc;
+ function Get_Component_Instance
+ (Syn_Inst : Synth_Instance_Acc) return Synth_Instance_Acc;
+
+ -- Return the scope of the parent of BLK. Deals with architecture bodies.
+ function Get_Parent_Scope (Blk : Node) return Sim_Info_Acc;
+
+ procedure Set_Uninstantiated_Scope
+ (Syn_Inst : Synth_Instance_Acc; Bod : Node);
+private
+ type Obj_Kind is
+ (
+ Obj_None,
+ Obj_Object,
+ Obj_Subtype,
+ Obj_Instance
+ );
+
+ type Obj_Type (Kind : Obj_Kind := Obj_None) is record
+ case Kind is
+ when Obj_None =>
+ null;
+ when Obj_Object =>
+ Obj : Valtyp;
+ when Obj_Subtype =>
+ T_Typ : Type_Acc;
+ when Obj_Instance =>
+ I_Inst : Synth_Instance_Acc;
+ end case;
+ end record;
+
+ type Objects_Array is array (Object_Slot_Type range <>) of Obj_Type;
+
+ type Synth_Instance_Type (Max_Objs : Object_Slot_Type) is limited record
+ Is_Const : Boolean;
+
+ -- True if a fatal error has been detected that aborts the synthesis
+ -- of this instance.
+ Is_Error : Boolean;
+
+ Id : Instance_Id_Type;
+
+ -- The corresponding info for this instance.
+ -- This is used for lookup.
+ Block_Scope : Sim_Info_Acc;
+
+ -- The corresponding info the the uninstantiated specification of
+ -- an instantiated package. When an object is looked for from the
+ -- uninstantiated body, the scope of the uninstantiated specification
+ -- is used. And it is different from Block_Scope.
+ -- This is used for lookup of uninstantiated specification.
+ Uninst_Scope : Sim_Info_Acc;
+
+ -- Instance of the parent scope.
+ Up_Block : Synth_Instance_Acc;
+
+ -- Source construct corresponding to this instance.
+ Source_Scope : Node;
+
+ -- Block configuration (unless the instance is for a package).
+ Config : Node;
+
+ -- Chain of verification units that applies to this one.
+ Extra_Units : Synth_Instance_Acc;
+ Extra_Link : Synth_Instance_Acc;
+
+ Elab_Objects : Object_Slot_Type;
+
+ -- Instance for synthesis.
+ Objects : Objects_Array (1 .. Max_Objs);
+ end record;
+end Elab.Vhdl_Context;