From 7cf780c73be8429720195ddeaeb3682b106f4c38 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Fri, 12 Feb 2021 18:12:04 +0100 Subject: synth-expr: compute signess for range array attributes. Fix #1645 --- src/synth/synth-decls.adb | 3 +-- src/synth/synth-expr.adb | 21 +++++++-------------- src/synth/synth-expr.ads | 2 +- 3 files changed, 9 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/synth/synth-decls.adb b/src/synth/synth-decls.adb index db510e856..f1835e5b9 100644 --- a/src/synth/synth-decls.adb +++ b/src/synth/synth-decls.adb @@ -304,8 +304,7 @@ package body Synth.Decls is begin L := Get_Value (Get_Left_Limit (Cst)); R := Get_Value (Get_Right_Limit (Cst)); - Rng := Synth_Discrete_Range_Expression - (L, R, Get_Direction (Cst)); + Rng := Build_Discrete_Range_Type (L, R, Get_Direction (Cst)); W := Discrete_Range_Width (Rng); Typ := Create_Discrete_Type (Rng, Scalar_Size_To_Size (Def), W); diff --git a/src/synth/synth-expr.adb b/src/synth/synth-expr.adb index 0e3849149..ad5d2f50b 100644 --- a/src/synth/synth-expr.adb +++ b/src/synth/synth-expr.adb @@ -425,14 +425,14 @@ package body Synth.Expr is N := Arr (Arr'First); end Concat_Array; - function Synth_Discrete_Range_Expression + function Build_Discrete_Range_Type (L : Int64; R : Int64; Dir : Direction_Type) return Discrete_Range_Type is begin return (Dir => Dir, Left => L, Right => R, Is_Signed => L < 0 or R < 0); - end Synth_Discrete_Range_Expression; + end Build_Discrete_Range_Type; function Synth_Discrete_Range_Expression (Syn_Inst : Synth_Instance_Acc; Rng : Node) return Discrete_Range_Type @@ -457,10 +457,7 @@ package body Synth.Expr is Lval := Read_Discrete (L); Rval := Read_Discrete (R); - return (Dir => Get_Direction (Rng), - Left => Lval, - Right => Rval, - Is_Signed => Lval < 0 or Rval < 0); + return Build_Discrete_Range_Type (Lval, Rval, Get_Direction (Rng)); end Synth_Discrete_Range_Expression; function Synth_Float_Range_Expression @@ -595,10 +592,8 @@ package body Synth.Expr is B : Bound_Type; begin B := Synth_Array_Attribute (Syn_Inst, Bound); - Rng := Discrete_Range_Type'(Dir => B.Dir, - Is_Signed => True, - Left => Int64 (B.Left), - Right => Int64 (B.Right)); + Rng := Build_Discrete_Range_Type + (Int64 (B.Left), Int64 (B.Right), B.Dir); end; when Iir_Kind_Reverse_Range_Array_Attribute => declare @@ -617,10 +612,8 @@ package body Synth.Expr is B.Right := B.Left; B.Left := T; - Rng := Discrete_Range_Type'(Dir => B.Dir, - Is_Signed => True, - Left => Int64 (B.Left), - Right => Int64 (B.Right)); + Rng := Build_Discrete_Range_Type + (Int64 (B.Left), Int64 (B.Right), B.Dir); end; when Iir_Kinds_Denoting_Name => -- A discrete subtype name. diff --git a/src/synth/synth-expr.ads b/src/synth/synth-expr.ads index 0d1c92fa3..2d977c70c 100644 --- a/src/synth/synth-expr.ads +++ b/src/synth/synth-expr.ads @@ -100,7 +100,7 @@ package Synth.Expr is Atype : Node; Dim : Dim_Type) return Bound_Type; - function Synth_Discrete_Range_Expression + function Build_Discrete_Range_Type (L : Int64; R : Int64; Dir : Direction_Type) return Discrete_Range_Type; function Synth_Discrete_Range_Expression (Syn_Inst : Synth_Instance_Acc; Rng : Node) return Discrete_Range_Type; -- cgit v1.2.3