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 | |
parent | 5819a01f0b175002ed79b6ed5b42ed296b39f239 (diff) | |
download | ghdl-65049d145253b7a6faec9c0de3f545bdd5ae2597.tar.gz ghdl-65049d145253b7a6faec9c0de3f545bdd5ae2597.tar.bz2 ghdl-65049d145253b7a6faec9c0de3f545bdd5ae2597.zip |
synth: handle subtype conversions on interfaces.
-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 => |