diff options
author | Tristan Gingold <tgingold@free.fr> | 2019-10-13 18:51:53 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2019-10-13 18:54:25 +0200 |
commit | 6b4f4c01a59a4d7f5bd8081022b68a6f69c81aa8 (patch) | |
tree | 7d2ea3bd08371105eccce480003313dea266ee04 /src | |
parent | 0b9c75143e41f389b6f437c45746fbd6afc431b5 (diff) | |
download | ghdl-6b4f4c01a59a4d7f5bd8081022b68a6f69c81aa8.tar.gz ghdl-6b4f4c01a59a4d7f5bd8081022b68a6f69c81aa8.tar.bz2 ghdl-6b4f4c01a59a4d7f5bd8081022b68a6f69c81aa8.zip |
synth-oper: handle const array array concat.
Diffstat (limited to 'src')
-rw-r--r-- | src/synth/synth-oper.adb | 57 |
1 files changed, 41 insertions, 16 deletions
diff --git a/src/synth/synth-oper.adb b/src/synth/synth-oper.adb index b79754c5a..b36511adf 100644 --- a/src/synth/synth-oper.adb +++ b/src/synth/synth-oper.adb @@ -723,22 +723,47 @@ package body Synth.Oper is (N, Create_Onedimensional_Array_Subtype (Ret_Typ, Bnd)); end; when Iir_Predefined_Array_Array_Concat => - declare - L : constant Net := Get_Net (Left); - R : constant Net := Get_Net (Right); - Bnd : Bound_Type; - N : Net; - begin - N := Build_Concat2 (Build_Context, L, R); - Set_Location (N, Expr); - Bnd := Create_Bounds_From_Length - (Syn_Inst, - Get_Index_Type (Get_Type (Expr), 0), - Iir_Index32 (Get_Width (L) + Get_Width (R))); - - return Create_Value_Net - (N, Create_Vector_Type (Bnd, Get_Array_Element (Left.Typ))); - end; + if Is_Const (Left) and then Is_Const (Right) then + declare + Ret_Typ : constant Type_Acc := + Get_Value_Type (Syn_Inst, Get_Return_Type (Imp)); + Bnd : Bound_Type; + Res_Typ : Type_Acc; + Arr : Value_Array_Acc; + begin + Bnd := Create_Bounds_From_Length + (Syn_Inst, Get_Index_Type (Get_Type (Expr), 0), + Left.Arr.Len + Right.Arr.Len); + Res_Typ := Create_Onedimensional_Array_Subtype + (Ret_Typ, Bnd); + Arr := Create_Value_Array (Left.Arr.Len + Right.Arr.Len); + for I in Left.Arr.V'Range loop + Arr.V (I) := Left.Arr.V (I); + end loop; + for I in Right.Arr.V'Range loop + Arr.V (Left.Arr.Len + I) := Right.Arr.V (I); + end loop; + return Create_Value_Const_Array (Res_Typ, Arr); + end; + else + declare + L : constant Net := Get_Net (Left); + R : constant Net := Get_Net (Right); + Bnd : Bound_Type; + N : Net; + begin + N := Build_Concat2 (Build_Context, L, R); + Set_Location (N, Expr); + Bnd := Create_Bounds_From_Length + (Syn_Inst, + Get_Index_Type (Get_Type (Expr), 0), + Iir_Index32 (Get_Width (L) + Get_Width (R))); + + return Create_Value_Net + (N, + Create_Vector_Type (Bnd, Get_Array_Element (Left.Typ))); + end; + end if; when Iir_Predefined_Integer_Plus => if Is_Const_Val (Left) and then Is_Const_Val (Right) then return Create_Value_Discrete |