aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/synth/netlists-disp_vhdl.adb1
-rw-r--r--src/synth/netlists-expands.adb21
2 files changed, 18 insertions, 4 deletions
diff --git a/src/synth/netlists-disp_vhdl.adb b/src/synth/netlists-disp_vhdl.adb
index e49165691..f673a69de 100644
--- a/src/synth/netlists-disp_vhdl.adb
+++ b/src/synth/netlists-disp_vhdl.adb
@@ -827,6 +827,7 @@ package body Netlists.Disp_Vhdl is
" \o0 <= \i0;" & NL,
Inst);
if Id = Id_Dyn_Insert_En then
+ -- TODO: fix indentation.
Disp_Template (" if \i3 = '1' then" & NL, Inst);
end if;
Disp_Template
diff --git a/src/synth/netlists-expands.adb b/src/synth/netlists-expands.adb
index c6f2196e2..3eeee7d3b 100644
--- a/src/synth/netlists-expands.adb
+++ b/src/synth/netlists-expands.adb
@@ -261,7 +261,8 @@ package body Netlists.Expands is
Off : in out Uns32;
Dat : Net;
Memidx_Arr : Memidx_Array_Type;
- Net_Arr : Net_Array)
+ Net_Arr : Net_Array;
+ En : Net := No_Net)
is
Dat_W : constant Width := Get_Width (Dat);
type Count_Type is record
@@ -277,6 +278,7 @@ package body Netlists.Expands is
Next_Off : Uns32;
Prev_Net : Net;
Step : Uns32;
+ S : Net;
begin
-- Initialize count.
for I in Memidx_Arr'Range loop
@@ -337,7 +339,12 @@ package body Netlists.Expands is
V := Build_Extract (Ctxt, Mem, Off, Dat_W);
end if;
- V := Build_Mux2 (Ctxt, Net_Arr (Sel), V, Dat);
+ S := Net_Arr (Sel);
+ if En /= No_Net then
+ S := Build_Dyadic (Ctxt, Id_And, S, En);
+ end if;
+
+ V := Build_Mux2 (Ctxt, S, V, Dat);
Prev_Net := V;
Next_Off := Off + Dat_W;
@@ -364,7 +371,8 @@ package body Netlists.Expands is
end loop;
end Generate_Muxes;
- procedure Expand_Dyn_Insert (Ctxt : Context_Acc; Inst : Instance)
+ procedure Expand_Dyn_Insert
+ (Ctxt : Context_Acc; Inst : Instance; En : Net)
is
Mem : constant Net := Get_Input_Net (Inst, 0);
Dat : constant Net := Get_Input_Net (Inst, 1);
@@ -413,6 +421,9 @@ package body Netlists.Expands is
Disconnect (Get_Input (Inst, 0));
Disconnect (Get_Input (Inst, 1));
Disconnect (Get_Input (Inst, 2));
+ if En /= No_Net then
+ Disconnect (Get_Input (Inst, 3));
+ end if;
Remove_Instance (Inst);
end Expand_Dyn_Insert;
@@ -456,7 +467,9 @@ package body Netlists.Expands is
Expand_Dyn_Extract (Ctxt, Inst);
when Id_Dyn_Insert =>
- Expand_Dyn_Insert (Ctxt, Inst);
+ Expand_Dyn_Insert (Ctxt, Inst, No_Net);
+ when Id_Dyn_Insert_En =>
+ Expand_Dyn_Insert (Ctxt, Inst, Get_Input_Net (Inst, 3));
when Id_Rol =>
-- a rol b == shl (a, b) | shr (a, l - b)