aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2019-09-22 21:08:15 +0200
committerTristan Gingold <tgingold@free.fr>2019-09-22 21:08:15 +0200
commit65049d145253b7a6faec9c0de3f545bdd5ae2597 (patch)
tree7c948a4a80123b3f72c209f2395e0490db007efe /src/synth
parent5819a01f0b175002ed79b6ed5b42ed296b39f239 (diff)
downloadghdl-65049d145253b7a6faec9c0de3f545bdd5ae2597.tar.gz
ghdl-65049d145253b7a6faec9c0de3f545bdd5ae2597.tar.bz2
ghdl-65049d145253b7a6faec9c0de3f545bdd5ae2597.zip
synth: handle subtype conversions on interfaces.
Diffstat (limited to 'src/synth')
-rw-r--r--src/synth/synth-expr.adb35
-rw-r--r--src/synth/synth-stmts.adb6
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 =>