diff options
| author | Tristan Gingold <tgingold@free.fr> | 2019-09-22 21:08:15 +0200 | 
|---|---|---|
| committer | Tristan Gingold <tgingold@free.fr> | 2019-09-22 21:08:15 +0200 | 
| commit | 65049d145253b7a6faec9c0de3f545bdd5ae2597 (patch) | |
| tree | 7c948a4a80123b3f72c209f2395e0490db007efe /src | |
| parent | 5819a01f0b175002ed79b6ed5b42ed296b39f239 (diff) | |
| download | ghdl-65049d145253b7a6faec9c0de3f545bdd5ae2597.tar.gz ghdl-65049d145253b7a6faec9c0de3f545bdd5ae2597.tar.bz2 ghdl-65049d145253b7a6faec9c0de3f545bdd5ae2597.zip | |
synth: handle subtype conversions on interfaces.
Diffstat (limited to 'src')
| -rw-r--r-- | src/synth/synth-expr.adb | 35 | ||||
| -rw-r--r-- | src/synth/synth-stmts.adb | 6 | 
2 files changed, 31 insertions, 10 deletions
| diff --git a/src/synth/synth-expr.adb b/src/synth/synth-expr.adb index 49a57dcec..f4ab993da 100644 --- a/src/synth/synth-expr.adb +++ b/src/synth/synth-expr.adb @@ -780,13 +780,29 @@ package body Synth.Expr is        return Create_Value_Const_Array (Res_Type, Arr);     end Synth_Simple_Aggregate; +   function Reshape_Value (Val : Value_Acc; Ntype : Type_Acc) +                          return Value_Acc is +   begin +      case Val.Kind is +         when Value_Array => +            return Create_Value_Array (Ntype, Val.Arr); +         when Value_Const_Array => +            return Create_Value_Const_Array (Ntype, Val.Arr); +         when Value_Wire => +            return Create_Value_Wire (Val.W, Ntype); +         when Value_Net => +            return Create_Value_Net (Val.N, Ntype); +         when others => +            raise Internal_Error; +      end case; +   end Reshape_Value; +     function Synth_Subtype_Conversion (Val : Value_Acc;                                        Dtype : Type_Acc;                                        Bounds : Boolean;                                        Loc : Source.Syn_Src)                                       return Value_Acc     is -      pragma Unreferenced (Bounds);        Vtype : constant Type_Acc := Val.Typ;     begin        case Dtype.Kind is @@ -844,9 +860,17 @@ package body Synth.Expr is              --  TODO: check range              return Val;           when Type_Vector => -            --  pragma Assert (Vtype.Kind = Type_Vector); -            --  TODO: check width -            return Val; +            pragma Assert (Vtype.Kind = Type_Vector +                             or Vtype.Kind = Type_Slice); +            if Dtype.W /= Vtype.W then +               --  TODO: bad width. +               raise Internal_Error; +            end if; +            if Bounds then +               return Reshape_Value (Val, Dtype); +            else +               return Val; +            end if;           when Type_Slice =>              --  TODO: check width              return Val; @@ -855,8 +879,7 @@ package body Synth.Expr is              --  TODO: check bounds, handle elements              return Val;           when Type_Unbounded_Array => -            pragma Assert (Vtype.Kind = Type_Vector -                             or else Vtype.Kind = Type_Array); +            pragma Assert (Vtype.Kind = Type_Array);              return Val;           when Type_Unbounded_Vector =>              pragma Assert (Vtype.Kind = Type_Vector); diff --git a/src/synth/synth-stmts.adb b/src/synth/synth-stmts.adb index adff77778..999c585c2 100644 --- a/src/synth/synth-stmts.adb +++ b/src/synth/synth-stmts.adb @@ -280,7 +280,7 @@ package body Synth.Stmts is                                          Wid, Off, Typ);                 Synth_Slice_Suffix (Syn_Inst, Target, Typ.Vbound,                                     Res_Bnd, Inp, Step, Sl_Off, Wd); - +               Res_Type := Create_Vector_Type (Res_Bnd, Typ.Vec_El);                 if Inp /= No_Net then                    Targ_Net := Get_Current_Assign_Value                      (Build_Context, Wid, Off, Get_Type_Width (Typ)); @@ -288,12 +288,10 @@ package body Synth.Stmts is                      (Build_Context, Targ_Net, Get_Net (Val),                       Inp, Step, Sl_Off);                    Set_Location (V, Target); -                  Res_Type := Create_Vector_Type (Res_Bnd, Typ.Vec_El);                    Synth_Assign                      (Wid, Res_Type, Create_Value_Net (V, Res_Type), Off, Loc);                 else -                  --  FIXME: create slice type. -                  Synth_Assign (Wid, Typ, Val, Off + Uns32 (Sl_Off), Loc); +                  Synth_Assign (Wid, Res_Type, Val, Off + Uns32 (Sl_Off), Loc);                 end if;              end;           when others => | 
