aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2022-12-25 20:25:28 +0100
committerTristan Gingold <tgingold@free.fr>2022-12-26 10:25:20 +0100
commit8a6be3328e812256abd7b01e965ac60630a70888 (patch)
tree027b0ccd357f337c3d0bab6dbf027367f9d78b5e /src/synth
parentde6ca601a8e016b17b161d1e0fb4e0528381a977 (diff)
downloadghdl-8a6be3328e812256abd7b01e965ac60630a70888.tar.gz
ghdl-8a6be3328e812256abd7b01e965ac60630a70888.tar.bz2
ghdl-8a6be3328e812256abd7b01e965ac60630a70888.zip
synth: add value_sig_val to handle individual signal associations
Diffstat (limited to 'src/synth')
-rw-r--r--src/synth/elab-vhdl_context.adb25
-rw-r--r--src/synth/elab-vhdl_context.ads22
-rw-r--r--src/synth/elab-vhdl_debug.adb2
-rw-r--r--src/synth/elab-vhdl_values-debug.adb3
-rw-r--r--src/synth/elab-vhdl_values.adb26
-rw-r--r--src/synth/elab-vhdl_values.ads13
-rw-r--r--src/synth/synth-vhdl_context.adb3
-rw-r--r--src/synth/synth-vhdl_expr.adb1
-rw-r--r--src/synth/synth-vhdl_insts.adb3
-rw-r--r--src/synth/synth-vhdl_stmts.adb34
-rw-r--r--src/synth/synth-vhdl_stmts.ads19
11 files changed, 128 insertions, 23 deletions
diff --git a/src/synth/elab-vhdl_context.adb b/src/synth/elab-vhdl_context.adb
index 136cc50f0..d77b8ea6e 100644
--- a/src/synth/elab-vhdl_context.adb
+++ b/src/synth/elab-vhdl_context.adb
@@ -53,6 +53,7 @@ package body Elab.Vhdl_Context is
new Synth_Instance_Type'(Max_Objs => Global_Info.Nbr_Objects,
Is_Const => False,
Is_Error => False,
+ Flag1 | Flag2 => False,
Id => Inst_Tables.Last + 1,
Block_Scope => Global_Info,
Up_Block => null,
@@ -101,6 +102,7 @@ package body Elab.Vhdl_Context is
Res := new Synth_Instance_Type'(Max_Objs => Nbr_Objs,
Is_Const => False,
Is_Error => False,
+ Flag1 | Flag2 => False,
Id => Inst_Tables.Last + 1,
Block_Scope => Scope,
Up_Block => Parent,
@@ -142,6 +144,7 @@ package body Elab.Vhdl_Context is
Res := new Synth_Instance_Type'(Max_Objs => Object_Slot_Type (Len),
Is_Const => False,
Is_Error => False,
+ Flag1 | Flag2 => False,
Id => Inst_Tables.Last + 1,
Block_Scope => Info,
Up_Block => Parent,
@@ -237,6 +240,28 @@ package body Elab.Vhdl_Context is
return Inst.Foreign;
end Get_Instance_Foreign;
+ procedure Set_Indiv_Signal_Assoc_Flag (Inst : Synth_Instance_Acc) is
+ begin
+ Inst.Flag1 := True;
+ end Set_Indiv_Signal_Assoc_Flag;
+
+ function Get_Indiv_Signal_Assoc_Flag (Inst : Synth_Instance_Acc)
+ return Boolean is
+ begin
+ return Inst.Flag1;
+ end Get_Indiv_Signal_Assoc_Flag;
+
+ procedure Set_Indiv_Signal_Assoc_Parent_Flag (Inst : Synth_Instance_Acc) is
+ begin
+ Inst.Flag2 := True;
+ end Set_Indiv_Signal_Assoc_Parent_Flag;
+
+ function Get_Indiv_Signal_Assoc_Parent_Flag (Inst : Synth_Instance_Acc)
+ return Boolean is
+ begin
+ return Inst.Flag2;
+ end Get_Indiv_Signal_Assoc_Parent_Flag;
+
procedure Add_Extra_Instance (Inst : Synth_Instance_Acc;
Extra : Synth_Instance_Acc) is
begin
diff --git a/src/synth/elab-vhdl_context.ads b/src/synth/elab-vhdl_context.ads
index 8598bbf56..76fd35473 100644
--- a/src/synth/elab-vhdl_context.ads
+++ b/src/synth/elab-vhdl_context.ads
@@ -74,6 +74,8 @@ package Elab.Vhdl_Context is
procedure Set_Error (Inst : Synth_Instance_Acc);
+ -- Get/Set the const flag.
+ -- This is for subprograms, and set when all parameters are static.
function Get_Instance_Const (Inst : Synth_Instance_Acc) return Boolean;
procedure Set_Instance_Const (Inst : Synth_Instance_Acc; Val : Boolean);
@@ -90,6 +92,19 @@ package Elab.Vhdl_Context is
procedure Set_Instance_Foreign (Inst : Synth_Instance_Acc; N : Int32);
function Get_Instance_Foreign (Inst : Synth_Instance_Acc) return Int32;
+ -- For simulation: set a flag if a signal parameter has individual
+ -- association. In that case, the value of the parameter must be
+ -- updated after a wait statement.
+ procedure Set_Indiv_Signal_Assoc_Flag (Inst : Synth_Instance_Acc);
+ function Get_Indiv_Signal_Assoc_Flag (Inst : Synth_Instance_Acc)
+ return Boolean;
+
+ -- For simulation: set if a parent has the Indiv_Signal_Assoc_Flag set.
+ -- In that case, update must continue in the parent.
+ procedure Set_Indiv_Signal_Assoc_Parent_Flag (Inst : Synth_Instance_Acc);
+ function Get_Indiv_Signal_Assoc_Parent_Flag (Inst : Synth_Instance_Acc)
+ return Boolean;
+
-- Add/Get extra instances.
-- Those instances are verification units.
procedure Add_Extra_Instance (Inst : Synth_Instance_Acc;
@@ -233,6 +248,13 @@ private
-- of this instance.
Is_Error : Boolean;
+ -- For simulation: set if a subprogram has a signal parameter
+ -- associated by individual elements.
+ Flag1 : Boolean;
+
+ -- For simulation: set if a parent instance has Flag1 set.
+ Flag2 : Boolean;
+
Id : Instance_Id_Type;
-- The corresponding info for this instance.
diff --git a/src/synth/elab-vhdl_debug.adb b/src/synth/elab-vhdl_debug.adb
index d47c310f0..e5e40011e 100644
--- a/src/synth/elab-vhdl_debug.adb
+++ b/src/synth/elab-vhdl_debug.adb
@@ -280,6 +280,8 @@ package body Elab.Vhdl_Debug is
Disp_Memtyp (Get_Memtyp (Vt), Vtype);
when Value_Dyn_Alias =>
Put ("dyn alias");
+ when Value_Sig_Val =>
+ Put ("sig val");
when Value_Memory =>
Disp_Memtyp (Get_Memtyp (Vt), Vtype);
end case;
diff --git a/src/synth/elab-vhdl_values-debug.adb b/src/synth/elab-vhdl_values-debug.adb
index aec0b1e20..c995c0204 100644
--- a/src/synth/elab-vhdl_values-debug.adb
+++ b/src/synth/elab-vhdl_values-debug.adb
@@ -324,6 +324,9 @@ package body Elab.Vhdl_Values.Debug is
when Value_Dyn_Alias =>
Put ("dyn alias: ");
Debug_Typ1 (V.Typ);
+ when Value_Sig_Val =>
+ Put ("sig val: ");
+ Debug_Typ1 (V.Typ);
end case;
end Debug_Valtyp;
diff --git a/src/synth/elab-vhdl_values.adb b/src/synth/elab-vhdl_values.adb
index 045fcce2e..deb0d0ccb 100644
--- a/src/synth/elab-vhdl_values.adb
+++ b/src/synth/elab-vhdl_values.adb
@@ -34,6 +34,7 @@ package body Elab.Vhdl_Values is
| Value_Wire
| Value_Signal
| Value_Dyn_Alias
+ | Value_Sig_Val
| Value_Quantity
| Value_Terminal =>
return False;
@@ -268,6 +269,26 @@ package body Elab.Vhdl_Values is
end if;
end Strip_Const;
+ function Create_Value_Sig_Val (Sigs : Memory_Ptr;
+ Vals : Memory_Ptr;
+ Pool : Areapool_Acc) return Value_Acc
+ is
+ subtype Value_Type_Sig_Val is Value_Type (Value_Sig_Val);
+ function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Sig_Val);
+ begin
+ return To_Value_Acc (Alloc (Pool, (Kind => Value_Sig_Val,
+ I_Sigs => Sigs,
+ I_Vals => Vals)));
+ end Create_Value_Sig_Val;
+
+ function Create_Value_Sig_Val (Sigs : Memory_Ptr;
+ Vals : Memory_Ptr;
+ Typ : Type_Acc;
+ Pool : Areapool_Acc) return Valtyp is
+ begin
+ return (Typ, Create_Value_Sig_Val (Sigs, Vals, Pool));
+ end Create_Value_Sig_Val;
+
procedure Write_Value (Dest : Memory_Ptr; Vt : Valtyp)
is
Mt : Memtyp;
@@ -315,6 +336,8 @@ package body Elab.Vhdl_Values is
Src.Val.D_Poff, Src.Val.D_Ptyp,
Src.Val.D_Voff, Src.Val.D_Eoff,
Current_Pool));
+ when Value_Sig_Val =>
+ raise Internal_Error;
end case;
return Res;
end Copy;
@@ -545,7 +568,8 @@ package body Elab.Vhdl_Values is
when Value_Net
| Value_Wire
| Value_Signal
- | Value_Dyn_Alias =>
+ | Value_Dyn_Alias
+ | Value_Sig_Val =>
raise Internal_Error;
when Value_Memory =>
return (V.Typ, V.Val.Mem);
diff --git a/src/synth/elab-vhdl_values.ads b/src/synth/elab-vhdl_values.ads
index 4ed86da22..0e72fd128 100644
--- a/src/synth/elab-vhdl_values.ads
+++ b/src/synth/elab-vhdl_values.ads
@@ -60,7 +60,10 @@ package Elab.Vhdl_Values is
Value_Alias,
-- Used only for associations.
- Value_Dyn_Alias
+ Value_Dyn_Alias,
+
+ -- Used only for individual signal associations in simulation
+ Value_Sig_Val
);
type Value_Type (Kind : Value_Kind);
@@ -114,6 +117,9 @@ package Elab.Vhdl_Values is
D_Ptyp : Type_Acc; -- Type of the prefix (after offset).
D_Voff : Uns32; -- Variable offset
D_Eoff : Uns32; -- Fixed offset.
+ when Value_Sig_Val =>
+ I_Sigs : Memory_Ptr;
+ I_Vals : Memory_Ptr;
end case;
end record;
@@ -187,6 +193,11 @@ package Elab.Vhdl_Values is
function Create_Value_Const (Val : Valtyp; Loc : Node; Pool : Areapool_Acc)
return Valtyp;
+ function Create_Value_Sig_Val (Sigs : Memory_Ptr;
+ Vals : Memory_Ptr;
+ Typ : Type_Acc;
+ Pool : Areapool_Acc) return Valtyp;
+
-- If VAL is a const, replace it by its value.
procedure Strip_Const (Vt : in out Valtyp);
diff --git a/src/synth/synth-vhdl_context.adb b/src/synth/synth-vhdl_context.adb
index 81143bea9..7d05e203a 100644
--- a/src/synth/synth-vhdl_context.adb
+++ b/src/synth/synth-vhdl_context.adb
@@ -464,7 +464,8 @@ package body Synth.Vhdl_Context is
return True;
when Value_Net
| Value_Signal
- | Value_Dyn_Alias =>
+ | Value_Dyn_Alias
+ | Value_Sig_Val =>
return False;
when Value_Quantity
| Value_Terminal =>
diff --git a/src/synth/synth-vhdl_expr.adb b/src/synth/synth-vhdl_expr.adb
index 036e5a27e..83aecb420 100644
--- a/src/synth/synth-vhdl_expr.adb
+++ b/src/synth/synth-vhdl_expr.adb
@@ -2060,6 +2060,7 @@ package body Synth.Vhdl_Expr is
Res := Synth_Name (Syn_Inst, Expr);
if Res.Val /= null then
if (Res.Val.Kind = Value_Signal
+ or else Res.Val.Kind = Value_Sig_Val
or else (Res.Val.Kind = Value_Alias
and then Res.Val.A_Obj.Kind = Value_Signal))
then
diff --git a/src/synth/synth-vhdl_insts.adb b/src/synth/synth-vhdl_insts.adb
index fc9788f78..88f023354 100644
--- a/src/synth/synth-vhdl_insts.adb
+++ b/src/synth/synth-vhdl_insts.adb
@@ -230,7 +230,8 @@ package body Synth.Vhdl_Insts is
| Value_File
| Value_Quantity
| Value_Terminal
- | Value_Dyn_Alias =>
+ | Value_Dyn_Alias
+ | Value_Sig_Val =>
raise Internal_Error;
end case;
end Hash_Const;
diff --git a/src/synth/synth-vhdl_stmts.adb b/src/synth/synth-vhdl_stmts.adb
index c010ced3e..bba8c823b 100644
--- a/src/synth/synth-vhdl_stmts.adb
+++ b/src/synth/synth-vhdl_stmts.adb
@@ -770,7 +770,8 @@ package body Synth.Vhdl_Stmts is
| Value_Const
| Value_Alias
| Value_Dyn_Alias
- | Value_Signal =>
+ | Value_Signal
+ | Value_Sig_Val =>
raise Internal_Error;
end case;
when Target_Aggregate =>
@@ -2031,17 +2032,6 @@ package body Synth.Vhdl_Stmts is
return Count;
end Count_Individual_Associations;
- type Assoc_Record is record
- Formal : Node;
- Form_Off : Value_Offsets;
-
- Act_Base : Valtyp;
- Act_Typ : Type_Acc;
- Act_Off : Value_Offsets;
- Act_Dyn : Dyn_Name;
- end record;
-
- type Assoc_Array is array (Natural range <>) of Assoc_Record;
type Assoc_Array_Acc is access Assoc_Array;
procedure Free_Assoc_Array is new Ada.Unchecked_Deallocation
(Assoc_Array, Assoc_Array_Acc);
@@ -2145,18 +2135,24 @@ package body Synth.Vhdl_Stmts is
A.Act_Typ.Sz);
end;
end loop;
- declare
- D : Destroy_Type;
- begin
- Destroy_Init (D, Subprg_Inst);
- Destroy_Object (D, Inter);
- Destroy_Finish (D);
- end;
+ elsif Flags.Flag_Simulation then
+ Res := Hook_Create_Value_For_Signal_Individual_Assocs
+ (Subprg_Inst, Assocs.all, Formal_Typ);
else
Res := No_Valtyp;
raise Internal_Error;
end if;
+ -- Destroy the object. It will be recreated by
+ -- Synth_Subprogram_Association.
+ declare
+ D : Destroy_Type;
+ begin
+ Destroy_Init (D, Subprg_Inst);
+ Destroy_Object (D, Inter);
+ Destroy_Finish (D);
+ end;
+
Free_Assoc_Array (Assocs);
return Res;
diff --git a/src/synth/synth-vhdl_stmts.ads b/src/synth/synth-vhdl_stmts.ads
index c07dc7224..ac9cd13d8 100644
--- a/src/synth/synth-vhdl_stmts.ads
+++ b/src/synth/synth-vhdl_stmts.ads
@@ -211,6 +211,25 @@ package Synth.Vhdl_Stmts is
Val : Valtyp;
Loc : Node);
+ type Assoc_Record is record
+ Formal : Node;
+ Form_Off : Value_Offsets;
+
+ Act_Base : Valtyp;
+ Act_Typ : Type_Acc;
+ Act_Off : Value_Offsets;
+ Act_Dyn : Dyn_Name;
+ end record;
+
+ type Assoc_Array is array (Natural range <>) of Assoc_Record;
+
+ -- For simulation: create a value for individual signal associations.
+ type Create_Value_For_Signal_Individual_Assocs_Acc is
+ access function (Inst : Synth_Instance_Acc;
+ Assocs : Assoc_Array;
+ Typ : Type_Acc) return Valtyp;
+ Hook_Create_Value_For_Signal_Individual_Assocs :
+ Create_Value_For_Signal_Individual_Assocs_Acc;
private
-- There are 2 execution mode: