aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/synth/netlists-folds.adb4
-rw-r--r--src/synth/synth-context.adb13
2 files changed, 11 insertions, 6 deletions
diff --git a/src/synth/netlists-folds.adb b/src/synth/netlists-folds.adb
index 6b8a57fb8..ef5cfdd2c 100644
--- a/src/synth/netlists-folds.adb
+++ b/src/synth/netlists-folds.adb
@@ -39,7 +39,7 @@ package body Netlists.Folds is
Inst := Build_Const_Bit (Ctxt, W);
Set_Param_Uns32 (Inst, 0, Uns32 (Val and 16#ffff_ffff#));
Set_Param_Uns32 (Inst, 1, Uns32 (Shift_Right (Val, 32)));
- for I in 2 .. (W + 31) / 32 loop
+ for I in 2 .. (W + 31) / 32 - 1 loop
Set_Param_Uns32 (Inst, Param_Idx (I), 0);
end loop;
return Get_Output (Inst, 0);
@@ -81,7 +81,7 @@ package body Netlists.Folds is
Inst := Build_Const_Bit (Ctxt, W);
Set_Param_Uns32 (Inst, 0, Uns32 (V and 16#ffff_ffff#));
Set_Param_Uns32 (Inst, 1, Uns32 (Shift_Right (V, 32)));
- for I in 2 .. (W + 31) / 32 loop
+ for I in 2 .. (W + 31) / 32 - 1 loop
Set_Param_Uns32 (Inst, Param_Idx (I), S);
end loop;
return Get_Output (Inst, 0);
diff --git a/src/synth/synth-context.adb b/src/synth/synth-context.adb
index 8aea87ea9..e5e5479a8 100644
--- a/src/synth/synth-context.adb
+++ b/src/synth/synth-context.adb
@@ -29,6 +29,7 @@ with Vhdl.Errors; use Vhdl.Errors;
with Vhdl.Utils;
with Netlists.Builders; use Netlists.Builders;
+with Netlists.Folds; use Netlists.Folds;
with Netlists.Concats;
with Synth.Expr; use Synth.Expr;
@@ -445,12 +446,16 @@ package body Synth.Context is
return Res;
end;
when Type_Discrete =>
- if Val.Typ.W <= 32 then
+ if Val.Typ.W <= 64 then
declare
- V : Uns32;
+ Sh : constant Natural := 64 - Natural (Val.Typ.W);
+ V : Uns64;
begin
- V := Uns32 (To_Uns64 (Val.Scal) and 16#ffff_ffff#);
- return Build_Const_UB32 (Build_Context, V, Val.Typ.W);
+ V := To_Uns64 (Val.Scal);
+ -- Keep only Val.Typ.W bits of the value.
+ V := Shift_Right (Shift_Left (V, Sh), Sh);
+ return Build2_Const_Uns
+ (Build_Context, V, Val.Typ.W);
end;
else
raise Internal_Error;