diff options
author | Tristan Gingold <tgingold@free.fr> | 2019-07-30 07:29:10 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2019-07-30 08:29:15 +0200 |
commit | 59fda76c701948c840c7e60d352ed8abb7699955 (patch) | |
tree | 24b12a969e374d629550375e4e13c669d5d3ad69 /src/synth/synth-stmts.adb | |
parent | 3dcf90fdee4286d5852604df417a5b6e75382265 (diff) | |
download | ghdl-59fda76c701948c840c7e60d352ed8abb7699955.tar.gz ghdl-59fda76c701948c840c7e60d352ed8abb7699955.tar.bz2 ghdl-59fda76c701948c840c7e60d352ed8abb7699955.zip |
synth: rework indexed names.
Diffstat (limited to 'src/synth/synth-stmts.adb')
-rw-r--r-- | src/synth/synth-stmts.adb | 70 |
1 files changed, 36 insertions, 34 deletions
diff --git a/src/synth/synth-stmts.adb b/src/synth/synth-stmts.adb index 468733b09..888746ae7 100644 --- a/src/synth/synth-stmts.adb +++ b/src/synth/synth-stmts.adb @@ -110,9 +110,41 @@ package body Synth.Stmts is end if; end Synth_Assignment_Aggregate; - procedure Synth_Assignment (Syn_Inst : Synth_Instance_Acc; - Target : Node; - Val : Value_Acc) is + procedure Synth_Indexed_Assignment + (Syn_Inst : Synth_Instance_Acc; Target : Node; Val : Value_Acc) + is + Pfx : constant Node := Get_Prefix (Target); + Targ : constant Value_Acc := Get_Value (Syn_Inst, Get_Base_Name (Pfx)); + Targ_Net : Net; + V : Net; + + Val_Net : Net; + Voff : Net; + Mul : Uns32; + Off : Uns32; + W : Width; + begin + Synth_Indexed_Name (Syn_Inst, Target, Targ.Typ, Voff, Mul, Off, W); + + pragma Assert (Get_Type_Width (Val.Typ) = W); + Targ_Net := Get_Last_Assigned_Value (Targ.W); + Val_Net := Get_Net (Val); + + if Voff = No_Net then + -- FIXME: check index. + pragma Assert (Mul = 0); + V := Build_Insert (Build_Context, Targ_Net, Val_Net, Off); + Set_Location (V, Target); + else + V := Build_Dyn_Insert + (Build_Context, Targ_Net, Val_Net, Voff, Mul, Int32 (Off)); + Set_Location (V, Target); + end if; + Synth_Assign (Targ, Create_Value_Net (V, Targ.Typ)); + end Synth_Indexed_Assignment; + + procedure Synth_Assignment + (Syn_Inst : Synth_Instance_Acc; Target : Node; Val : Value_Acc) is begin case Get_Kind (Target) is when Iir_Kind_Simple_Name => @@ -125,37 +157,7 @@ package body Synth.Stmts is when Iir_Kind_Aggregate => Synth_Assignment_Aggregate (Syn_Inst, Target, Val); when Iir_Kind_Indexed_Name => - declare - Pfx : constant Node := Get_Prefix (Target); - Targ : constant Value_Acc := - Get_Value (Syn_Inst, Get_Base_Name (Pfx)); - Indexes : constant Node_Flist := Get_Index_List (Target); - N_Idx : Node; - Idx : Value_Acc; - Targ_Net : Net; - V : Net; - begin - if Get_Nbr_Elements (Indexes) /= 1 - or else Targ.Kind /= Value_Wire - then - -- Only support assignment of vector. - raise Internal_Error; - end if; - N_Idx := Get_Nth_Element (Indexes, 0); - Idx := Synth_Expression_With_Type - (Syn_Inst, N_Idx, Get_Type (N_Idx)); - if Is_Const (Idx) then - -- FIXME: check index. - Targ_Net := Get_Last_Assigned_Value (Targ.W); - V := Build_Insert (Build_Context, - Targ_Net, Get_Net (Val), - Index_To_Offset (Targ, Idx.Scal, Target)); - Set_Location (V, Target); - else - raise Internal_Error; - end if; - Synth_Assign (Targ, Create_Value_Net (V, Targ.Typ)); - end; + Synth_Indexed_Assignment (Syn_Inst, Target, Val); when Iir_Kind_Slice_Name => declare Pfx : constant Node := Get_Prefix (Target); |