aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth/synth-vhdl_expr.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/synth/synth-vhdl_expr.adb')
-rw-r--r--src/synth/synth-vhdl_expr.adb39
1 files changed, 33 insertions, 6 deletions
diff --git a/src/synth/synth-vhdl_expr.adb b/src/synth/synth-vhdl_expr.adb
index 036e5a27e..6e397aa1a 100644
--- a/src/synth/synth-vhdl_expr.adb
+++ b/src/synth/synth-vhdl_expr.adb
@@ -2060,6 +2060,7 @@ package body Synth.Vhdl_Expr is
Res := Synth_Name (Syn_Inst, Expr);
if Res.Val /= null then
if (Res.Val.Kind = Value_Signal
+ or else Res.Val.Kind = Value_Sig_Val
or else (Res.Val.Kind = Value_Alias
and then Res.Val.A_Obj.Kind = Value_Signal))
then
@@ -2316,6 +2317,7 @@ package body Synth.Vhdl_Expr is
declare
Param : constant Node := Get_Parameter (Expr);
V : Valtyp;
+ Vi : Int64;
Dtype : Type_Acc;
begin
Dtype := Get_Subtype_Object (Syn_Inst, Get_Type (Expr));
@@ -2323,10 +2325,16 @@ package body Synth.Vhdl_Expr is
-- FIXME: to be generalized. Not always as simple as a
-- subtype conversion.
if Is_Static (V.Val) then
- V := Create_Value_Discrete (Read_Discrete (V), Dtype);
+ Vi := Read_Discrete (V);
+ if not In_Range (Dtype.Drange, Vi) then
+ Error_Msg_Synth (Syn_Inst, Expr, "value out of range");
+ return No_Valtyp;
+ end if;
+ return Create_Value_Discrete (Vi, Dtype);
+ else
+ return Synth_Subtype_Conversion
+ (Syn_Inst, V, Dtype, False, Expr);
end if;
- return Synth_Subtype_Conversion
- (Syn_Inst, V, Dtype, False, Expr);
end;
when Iir_Kind_Low_Type_Attribute =>
return Synth_Low_High_Type_Attribute (Syn_Inst, Expr, Dir_To);
@@ -2366,9 +2374,15 @@ package body Synth.Vhdl_Expr is
return Elab.Vhdl_Expr.Exec_Value_Attribute (Syn_Inst, Expr);
when Iir_Kind_Image_Attribute =>
return Elab.Vhdl_Expr.Exec_Image_Attribute (Syn_Inst, Expr);
- when Iir_Kind_Instance_Name_Attribute =>
- return Elab.Vhdl_Expr.Exec_Instance_Name_Attribute
- (Syn_Inst, Expr);
+ when Iir_Kind_Path_Name_Attribute
+ | Iir_Kind_Instance_Name_Attribute =>
+ declare
+ Mt : Memtyp;
+ begin
+ Mt := Elab.Vhdl_Expr.Exec_Path_Instance_Name_Attribute
+ (Syn_Inst, Expr);
+ return Create_Value_Memtyp (Mt);
+ end;
when Iir_Kind_Null_Literal =>
return Create_Value_Access (Null_Heap_Index, Expr_Type);
when Iir_Kind_Allocator_By_Subtype =>
@@ -2422,6 +2436,19 @@ package body Synth.Vhdl_Expr is
end if;
Error_Msg_Synth (Syn_Inst, Expr, "active attribute not allowed");
return No_Valtyp;
+ when Iir_Kind_Driving_Attribute =>
+ if Hook_Driving_Attribute /= null then
+ return Hook_Driving_Attribute (Syn_Inst, Expr);
+ end if;
+ Error_Msg_Synth (Syn_Inst, Expr, "driving attribute not allowed");
+ return No_Valtyp;
+ when Iir_Kind_Driving_Value_Attribute =>
+ if Hook_Driving_Value_Attribute /= null then
+ return Hook_Driving_Value_Attribute (Syn_Inst, Expr);
+ end if;
+ Error_Msg_Synth (Syn_Inst, Expr,
+ "driving_value attribute not allowed");
+ return No_Valtyp;
when Iir_Kind_Last_Value_Attribute =>
if Hook_Last_Value_Attribute /= null then
return Hook_Last_Value_Attribute (Syn_Inst, Expr);