diff options
Diffstat (limited to 'src/synth/synth-environment.adb')
-rw-r--r-- | src/synth/synth-environment.adb | 38 |
1 files changed, 7 insertions, 31 deletions
diff --git a/src/synth/synth-environment.adb b/src/synth/synth-environment.adb index 4c8850a6a..3e5a65b6d 100644 --- a/src/synth/synth-environment.adb +++ b/src/synth/synth-environment.adb @@ -20,6 +20,7 @@ with Netlists.Builders; use Netlists.Builders; with Netlists.Utils; use Netlists.Utils; +with Netlists.Concats; with Errorout; use Errorout; with Synth.Inference; with Synth.Errors; use Synth.Errors; @@ -620,17 +621,15 @@ package body Synth.Environment is -- Build a vector declare - Vec : Net_Tables.Instance; + use Netlists.Concats; + Vec : Concat_Type; Seq : Seq_Assign; P : Partial_Assign; Cur_Off : Uns32; Cur_Wd : Width; - Last : Int32; - Inst : Instance; Res : Net; begin - Net_Tables.Init (Vec); Cur_Off := Off; Cur_Wd := Wd; pragma Assert (Wd > 0); @@ -651,11 +650,11 @@ package body Synth.Environment is -- Found. if Pr.Offset = Cur_Off and then Pw = Cur_Wd then -- No need to extract. - Net_Tables.Append (Vec, Pr.Value); + Append (Vec, Pr.Value); else Cur_Wd := Width'Min (Cur_Wd, Pw - (Cur_Off - Pr.Offset)); - Net_Tables.Append + Append (Vec, Build_Extract (Ctxt, Pr.Value, Cur_Off - Pr.Offset, Cur_Wd)); end if; @@ -678,7 +677,7 @@ package body Synth.Environment is Seq := Get_Assign_Prev (Seq); if Seq = No_Seq_Assign then -- Extract from gate. - Net_Tables.Append + Append (Vec, Build_Extract (Ctxt, Wire.Gate, Cur_Off, Cur_Wd)); exit; @@ -694,30 +693,7 @@ package body Synth.Environment is end loop; -- Concat - Last := Net_Tables.Last (Vec); - case Last is - when Int32'First .. 0 => - raise Internal_Error; - when 1 => - Res := Vec.Table (1); - when 2 => - Res := Build_Concat2 (Ctxt, Vec.Table (2), Vec.Table (1)); - when 3 => - Res := Build_Concat3 - (Ctxt, Vec.Table (3), Vec.Table (2), Vec.Table (1)); - when 4 => - Res := Build_Concat4 - (Ctxt, - Vec.Table (4), Vec.Table (3), Vec.Table (2), Vec.Table (1)); - when 5 .. Int32'Last => - Res := Build_Concatn (Ctxt, Wd, Uns32 (Last)); - Inst := Get_Parent (Res); - for I in Net_Tables.First .. Last loop - Connect (Get_Input (Inst, Port_Idx (I - 1)), Vec.Table (I)); - end loop; - end case; - -- Free the vector and return it. - Net_Tables.Free (Vec); + Build (Ctxt, Vec, Res); return Res; end; end Get_Current_Assign_Value; |