aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/libghdl/thin/vhdl/nodes.py53
-rw-r--r--src/vhdl/vhdl-elocations.adb1
-rw-r--r--src/vhdl/vhdl-elocations.ads1
-rw-r--r--src/vhdl/vhdl-errors.adb3
-rw-r--r--src/vhdl/vhdl-nodes.adb1
-rw-r--r--src/vhdl/vhdl-nodes.ads4
-rw-r--r--src/vhdl/vhdl-nodes_meta.adb70
-rw-r--r--src/vhdl/vhdl-prints.adb2
-rw-r--r--src/vhdl/vhdl-sem_expr.adb3
-rw-r--r--src/vhdl/vhdl-sem_names.adb256
10 files changed, 225 insertions, 169 deletions
diff --git a/python/libghdl/thin/vhdl/nodes.py b/python/libghdl/thin/vhdl/nodes.py
index 720676b33..60e7c2ba4 100644
--- a/python/libghdl/thin/vhdl/nodes.py
+++ b/python/libghdl/thin/vhdl/nodes.py
@@ -293,31 +293,32 @@ class Iir_Kind:
Dot_Attribute = 278
Integ_Attribute = 279
Above_Attribute = 280
- Delayed_Attribute = 281
- Stable_Attribute = 282
- Quiet_Attribute = 283
- Transaction_Attribute = 284
- Event_Attribute = 285
- Active_Attribute = 286
- Last_Event_Attribute = 287
- Last_Active_Attribute = 288
- Last_Value_Attribute = 289
- Driving_Attribute = 290
- Driving_Value_Attribute = 291
- Behavior_Attribute = 292
- Structure_Attribute = 293
- Simple_Name_Attribute = 294
- Instance_Name_Attribute = 295
- Path_Name_Attribute = 296
- Left_Array_Attribute = 297
- Right_Array_Attribute = 298
- High_Array_Attribute = 299
- Low_Array_Attribute = 300
- Length_Array_Attribute = 301
- Ascending_Array_Attribute = 302
- Range_Array_Attribute = 303
- Reverse_Range_Array_Attribute = 304
- Attribute_Name = 305
+ Quantity_Delayed_Attribute = 281
+ Delayed_Attribute = 282
+ Stable_Attribute = 283
+ Quiet_Attribute = 284
+ Transaction_Attribute = 285
+ Event_Attribute = 286
+ Active_Attribute = 287
+ Last_Event_Attribute = 288
+ Last_Active_Attribute = 289
+ Last_Value_Attribute = 290
+ Driving_Attribute = 291
+ Driving_Value_Attribute = 292
+ Behavior_Attribute = 293
+ Structure_Attribute = 294
+ Simple_Name_Attribute = 295
+ Instance_Name_Attribute = 296
+ Path_Name_Attribute = 297
+ Left_Array_Attribute = 298
+ Right_Array_Attribute = 299
+ High_Array_Attribute = 300
+ Low_Array_Attribute = 301
+ Length_Array_Attribute = 302
+ Ascending_Array_Attribute = 303
+ Range_Array_Attribute = 304
+ Reverse_Range_Array_Attribute = 305
+ Attribute_Name = 306
class Iir_Kinds:
@@ -602,6 +603,7 @@ class Iir_Kinds:
Iir_Kind.Dot_Attribute,
Iir_Kind.Integ_Attribute,
Iir_Kind.Above_Attribute,
+ Iir_Kind.Quantity_Delayed_Attribute,
Iir_Kind.Delayed_Attribute,
Iir_Kind.Stable_Attribute,
Iir_Kind.Quiet_Attribute,
@@ -852,6 +854,7 @@ class Iir_Kinds:
Iir_Kind.Dot_Attribute,
Iir_Kind.Integ_Attribute,
Iir_Kind.Above_Attribute,
+ Iir_Kind.Quantity_Delayed_Attribute,
Iir_Kind.Delayed_Attribute,
Iir_Kind.Stable_Attribute,
Iir_Kind.Quiet_Attribute,
diff --git a/src/vhdl/vhdl-elocations.adb b/src/vhdl/vhdl-elocations.adb
index f6e1ac80e..c4cab3475 100644
--- a/src/vhdl/vhdl-elocations.adb
+++ b/src/vhdl/vhdl-elocations.adb
@@ -418,6 +418,7 @@ package body Vhdl.Elocations is
| Iir_Kind_Dot_Attribute
| Iir_Kind_Integ_Attribute
| Iir_Kind_Above_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute
| Iir_Kind_Delayed_Attribute
| Iir_Kind_Stable_Attribute
| Iir_Kind_Quiet_Attribute
diff --git a/src/vhdl/vhdl-elocations.ads b/src/vhdl/vhdl-elocations.ads
index daeda35ae..696186b1a 100644
--- a/src/vhdl/vhdl-elocations.ads
+++ b/src/vhdl/vhdl-elocations.ads
@@ -649,6 +649,7 @@ package Vhdl.Elocations is
-- Iir_Kind_Ztf_Attribute (None)
-- Iir_Kind_Dot_Attribute (None)
-- Iir_Kind_Integ_Attribute (None)
+ -- Iir_Kind_Quantity_Delayed_Attribute (None)
-- Iir_Kind_Ramp_Attribute (None)
-- Iir_Kind_Above_Attribute (None)
diff --git a/src/vhdl/vhdl-errors.adb b/src/vhdl/vhdl-errors.adb
index 63e3bb02b..c05fa3265 100644
--- a/src/vhdl/vhdl-errors.adb
+++ b/src/vhdl/vhdl-errors.adb
@@ -708,7 +708,8 @@ package body Vhdl.Errors is
return "'stable attribute";
when Iir_Kind_Quiet_Attribute =>
return "'quiet attribute";
- when Iir_Kind_Delayed_Attribute =>
+ when Iir_Kind_Delayed_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute =>
return "'delayed attribute";
when Iir_Kind_Driving_Attribute =>
return "'driving attribute";
diff --git a/src/vhdl/vhdl-nodes.adb b/src/vhdl/vhdl-nodes.adb
index 50d7fe2cf..518270114 100644
--- a/src/vhdl/vhdl-nodes.adb
+++ b/src/vhdl/vhdl-nodes.adb
@@ -1194,6 +1194,7 @@ package body Vhdl.Nodes is
| Iir_Kind_Dot_Attribute
| Iir_Kind_Integ_Attribute
| Iir_Kind_Above_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute
| Iir_Kind_Delayed_Attribute
| Iir_Kind_Stable_Attribute
| Iir_Kind_Quiet_Attribute
diff --git a/src/vhdl/vhdl-nodes.ads b/src/vhdl/vhdl-nodes.ads
index 217f6a562..4ed10957d 100644
--- a/src/vhdl/vhdl-nodes.ads
+++ b/src/vhdl/vhdl-nodes.ads
@@ -4453,6 +4453,7 @@ package Vhdl.Nodes is
-- Iir_Kind_Above_Attribute (Short)
-- Iir_Kind_Dot_Attribute (Short)
-- Iir_Kind_Integ_Attribute (Short)
+ -- Iir_Kind_Quantity_Delayed_Attribute (Short)
--
-- Get/Set_Prefix (Field0)
--
@@ -4464,6 +4465,7 @@ package Vhdl.Nodes is
-- Get/Set_Signal_Attribute_Declaration (Field3)
--
-- Only for Iir_Kind_Above_Attribute:
+ -- Only for Iir_Kind_Quantity_Delayed_Attribute:
-- Get/Set_Parameter (Field4)
--
-- Get/Set_Base_Name (Field5)
@@ -5006,6 +5008,7 @@ package Vhdl.Nodes is
Iir_Kind_Dot_Attribute,
Iir_Kind_Integ_Attribute,
Iir_Kind_Above_Attribute,
+ Iir_Kind_Quantity_Delayed_Attribute,
Iir_Kind_Delayed_Attribute, -- signal_attribute
Iir_Kind_Stable_Attribute, -- signal_attribute
Iir_Kind_Quiet_Attribute, -- signal_attribute
@@ -6223,6 +6226,7 @@ package Vhdl.Nodes is
--Iir_Kind_Dot_Attribute
--Iir_Kind_Integ_Attribute
--Iir_Kind_Above_Attribute
+ --Iir_Kind_Quantity_Delayed_Attribute
--Iir_Kind_Delayed_Attribute
--Iir_Kind_Stable_Attribute
--Iir_Kind_Quiet_Attribute
diff --git a/src/vhdl/vhdl-nodes_meta.adb b/src/vhdl/vhdl-nodes_meta.adb
index 48029e8c9..c4e5e7d1a 100644
--- a/src/vhdl/vhdl-nodes_meta.adb
+++ b/src/vhdl/vhdl-nodes_meta.adb
@@ -1671,6 +1671,8 @@ package body Vhdl.Nodes_Meta is
return "integ_attribute";
when Iir_Kind_Above_Attribute =>
return "above_attribute";
+ when Iir_Kind_Quantity_Delayed_Attribute =>
+ return "quantity_delayed_attribute";
when Iir_Kind_Delayed_Attribute =>
return "delayed_attribute";
when Iir_Kind_Stable_Attribute =>
@@ -4868,6 +4870,15 @@ package body Vhdl.Nodes_Meta is
Field_Signal_Attribute_Declaration,
Field_Parameter,
Field_Base_Name,
+ -- Iir_Kind_Quantity_Delayed_Attribute
+ Field_Expr_Staticness,
+ Field_Name_Staticness,
+ Field_Prefix,
+ Field_Type,
+ Field_Attr_Chain,
+ Field_Signal_Attribute_Declaration,
+ Field_Parameter,
+ Field_Base_Name,
-- Iir_Kind_Delayed_Attribute
Field_Has_Active_Flag,
Field_Expr_Staticness,
@@ -5324,31 +5335,32 @@ package body Vhdl.Nodes_Meta is
Iir_Kind_Dot_Attribute => 2123,
Iir_Kind_Integ_Attribute => 2130,
Iir_Kind_Above_Attribute => 2138,
- Iir_Kind_Delayed_Attribute => 2147,
- Iir_Kind_Stable_Attribute => 2156,
- Iir_Kind_Quiet_Attribute => 2165,
- Iir_Kind_Transaction_Attribute => 2174,
- Iir_Kind_Event_Attribute => 2178,
- Iir_Kind_Active_Attribute => 2182,
- Iir_Kind_Last_Event_Attribute => 2186,
- Iir_Kind_Last_Active_Attribute => 2190,
- Iir_Kind_Last_Value_Attribute => 2194,
- Iir_Kind_Driving_Attribute => 2198,
- Iir_Kind_Driving_Value_Attribute => 2202,
- Iir_Kind_Behavior_Attribute => 2202,
- Iir_Kind_Structure_Attribute => 2202,
- Iir_Kind_Simple_Name_Attribute => 2209,
- Iir_Kind_Instance_Name_Attribute => 2214,
- Iir_Kind_Path_Name_Attribute => 2219,
- Iir_Kind_Left_Array_Attribute => 2226,
- Iir_Kind_Right_Array_Attribute => 2233,
- Iir_Kind_High_Array_Attribute => 2240,
- Iir_Kind_Low_Array_Attribute => 2247,
- Iir_Kind_Length_Array_Attribute => 2254,
- Iir_Kind_Ascending_Array_Attribute => 2261,
- Iir_Kind_Range_Array_Attribute => 2268,
- Iir_Kind_Reverse_Range_Array_Attribute => 2275,
- Iir_Kind_Attribute_Name => 2284
+ Iir_Kind_Quantity_Delayed_Attribute => 2146,
+ Iir_Kind_Delayed_Attribute => 2155,
+ Iir_Kind_Stable_Attribute => 2164,
+ Iir_Kind_Quiet_Attribute => 2173,
+ Iir_Kind_Transaction_Attribute => 2182,
+ Iir_Kind_Event_Attribute => 2186,
+ Iir_Kind_Active_Attribute => 2190,
+ Iir_Kind_Last_Event_Attribute => 2194,
+ Iir_Kind_Last_Active_Attribute => 2198,
+ Iir_Kind_Last_Value_Attribute => 2202,
+ Iir_Kind_Driving_Attribute => 2206,
+ Iir_Kind_Driving_Value_Attribute => 2210,
+ Iir_Kind_Behavior_Attribute => 2210,
+ Iir_Kind_Structure_Attribute => 2210,
+ Iir_Kind_Simple_Name_Attribute => 2217,
+ Iir_Kind_Instance_Name_Attribute => 2222,
+ Iir_Kind_Path_Name_Attribute => 2227,
+ Iir_Kind_Left_Array_Attribute => 2234,
+ Iir_Kind_Right_Array_Attribute => 2241,
+ Iir_Kind_High_Array_Attribute => 2248,
+ Iir_Kind_Low_Array_Attribute => 2255,
+ Iir_Kind_Length_Array_Attribute => 2262,
+ Iir_Kind_Ascending_Array_Attribute => 2269,
+ Iir_Kind_Range_Array_Attribute => 2276,
+ Iir_Kind_Reverse_Range_Array_Attribute => 2283,
+ Iir_Kind_Attribute_Name => 2292
);
function Get_Fields_First (K : Iir_Kind) return Fields_Index is
@@ -8413,6 +8425,7 @@ package body Vhdl.Nodes_Meta is
| Iir_Kind_Dot_Attribute
| Iir_Kind_Integ_Attribute
| Iir_Kind_Above_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute
| Iir_Kind_Delayed_Attribute
| Iir_Kind_Stable_Attribute
| Iir_Kind_Quiet_Attribute
@@ -8623,6 +8636,7 @@ package body Vhdl.Nodes_Meta is
| Iir_Kind_Dot_Attribute
| Iir_Kind_Integ_Attribute
| Iir_Kind_Above_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute
| Iir_Kind_Delayed_Attribute
| Iir_Kind_Stable_Attribute
| Iir_Kind_Quiet_Attribute
@@ -10819,6 +10833,7 @@ package body Vhdl.Nodes_Meta is
| Iir_Kind_Dot_Attribute
| Iir_Kind_Integ_Attribute
| Iir_Kind_Above_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute
| Iir_Kind_Delayed_Attribute
| Iir_Kind_Stable_Attribute
| Iir_Kind_Quiet_Attribute
@@ -11061,6 +11076,7 @@ package body Vhdl.Nodes_Meta is
| Iir_Kind_Dot_Attribute
| Iir_Kind_Integ_Attribute
| Iir_Kind_Above_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute
| Iir_Kind_Delayed_Attribute
| Iir_Kind_Stable_Attribute
| Iir_Kind_Quiet_Attribute
@@ -11131,6 +11147,7 @@ package body Vhdl.Nodes_Meta is
| Iir_Kind_Dot_Attribute
| Iir_Kind_Integ_Attribute
| Iir_Kind_Above_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute
| Iir_Kind_Delayed_Attribute
| Iir_Kind_Stable_Attribute
| Iir_Kind_Quiet_Attribute
@@ -11256,6 +11273,7 @@ package body Vhdl.Nodes_Meta is
| Iir_Kind_Ltf_Attribute
| Iir_Kind_Ztf_Attribute
| Iir_Kind_Above_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute
| Iir_Kind_Delayed_Attribute
| Iir_Kind_Stable_Attribute
| Iir_Kind_Quiet_Attribute
@@ -11311,6 +11329,7 @@ package body Vhdl.Nodes_Meta is
| Iir_Kind_Dot_Attribute
| Iir_Kind_Integ_Attribute
| Iir_Kind_Above_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute
| Iir_Kind_Delayed_Attribute
| Iir_Kind_Stable_Attribute
| Iir_Kind_Quiet_Attribute
@@ -11327,6 +11346,7 @@ package body Vhdl.Nodes_Meta is
when Iir_Kind_Dot_Attribute
| Iir_Kind_Integ_Attribute
| Iir_Kind_Above_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute
| Iir_Kind_Delayed_Attribute
| Iir_Kind_Stable_Attribute
| Iir_Kind_Quiet_Attribute
diff --git a/src/vhdl/vhdl-prints.adb b/src/vhdl/vhdl-prints.adb
index 5b466857b..bd52fc10f 100644
--- a/src/vhdl/vhdl-prints.adb
+++ b/src/vhdl/vhdl-prints.adb
@@ -4646,6 +4646,8 @@ package body Vhdl.Prints is
when Iir_Kind_Signal_Slew_Attribute
| Iir_Kind_Quantity_Slew_Attribute =>
Disp_Parametered_Attribute (Ctxt, Name_Slew, Expr, 2);
+ when Iir_Kind_Quantity_Delayed_Attribute =>
+ Disp_Parametered_Attribute (Ctxt, Name_Delayed, Expr, 1);
when Iir_Kind_Ramp_Attribute =>
Disp_Parametered_Attribute (Ctxt, Name_Ramp, Expr, 2);
when Iir_Kind_Above_Attribute =>
diff --git a/src/vhdl/vhdl-sem_expr.adb b/src/vhdl/vhdl-sem_expr.adb
index fc7e59a7c..a4deece67 100644
--- a/src/vhdl/vhdl-sem_expr.adb
+++ b/src/vhdl/vhdl-sem_expr.adb
@@ -4376,7 +4376,8 @@ package body Vhdl.Sem_Expr is
| Iir_Kind_Ztf_Attribute
| Iir_Kind_Dot_Attribute
| Iir_Kind_Integ_Attribute
- | Iir_Kind_Ramp_Attribute =>
+ | Iir_Kind_Ramp_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute =>
return;
when Iir_Kind_Aggregate =>
Check_Read_Aggregate (Obj);
diff --git a/src/vhdl/vhdl-sem_names.adb b/src/vhdl/vhdl-sem_names.adb
index 2830e6e77..f632b614e 100644
--- a/src/vhdl/vhdl-sem_names.adb
+++ b/src/vhdl/vhdl-sem_names.adb
@@ -1242,7 +1242,7 @@ package body Vhdl.Sem_Names is
end Finish_Sem_Signal_Attribute;
procedure Sem_Quantity_Attribute_Parameters
- (Attr : Iir; Params : Iir_Array; Params_Type : Iir_Array; Min : Positive)
+ (Attr : Iir; Params : Iir_Array; Params_Type : Iir_Array; Min : Natural)
is
Param : Iir;
begin
@@ -1285,6 +1285,15 @@ package body Vhdl.Sem_Names is
Free_Iir (Attr_Name);
case Get_Kind (Attr) is
+ when Iir_Kind_Quantity_Delayed_Attribute =>
+ -- AMS-LRM17 16.2.6
+ -- Q'DELAYED[(T)]
+ -- Parameter:
+ -- T: A static expression of type REAL that evaluates to a
+ -- non-negative number. If omitted, defaults to 0.0.
+ Sem_Quantity_Attribute_Parameters
+ (Attr, Params, (1 => Real_Type_Definition,
+ 2 .. 4 => Null_Iir), 0);
when Iir_Kind_Above_Attribute =>
pragma Assert (Params'First = 1 and Params'Last = 1);
if Params (1) = Null_Iir then
@@ -1917,7 +1926,8 @@ package body Vhdl.Sem_Names is
| Iir_Kind_Signal_Slew_Attribute
| Iir_Kind_Zoh_Attribute
| Iir_Kind_Ltf_Attribute
- | Iir_Kind_Ztf_Attribute =>
+ | Iir_Kind_Ztf_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute =>
if Get_Parameter (Res) = Null_Iir then
-- Not finished. Need to emit an error message.
Finish_Sem_Quantity_Attribute (Name, Res, (1 => Null_Iir));
@@ -3007,7 +3017,8 @@ package body Vhdl.Sem_Names is
| Iir_Kind_Signal_Slew_Attribute
| Iir_Kind_Zoh_Attribute
| Iir_Kind_Ltf_Attribute
- | Iir_Kind_Ztf_Attribute =>
+ | Iir_Kind_Ztf_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute =>
declare
Params : Iir_Array (1 .. 4);
begin
@@ -3691,6 +3702,120 @@ package body Vhdl.Sem_Names is
return Res;
end Sem_Nature_Reference_Attribute;
+ function Sem_Quantity_Attribute (Attr : Iir_Attribute_Name) return Iir
+ is
+ use Std_Names;
+ Name_Prefix : constant Iir := Get_Prefix (Attr);
+ Prefix: Iir;
+ Res : Iir;
+ Res_Type : Iir;
+ begin
+ Prefix := Get_Named_Entity (Name_Prefix);
+ Prefix := Finish_Sem_Name_1 (Name_Prefix, Prefix);
+ if not Is_Quantity_Name (Prefix) then
+ Error_Msg_Sem
+ (+Attr, "prefix of %i attribute must denote a quantity", +Attr);
+ end if;
+
+ Res_Type := Get_Type (Prefix);
+ case Get_Identifier (Attr) is
+ when Name_Above =>
+ Res := Create_Iir (Iir_Kind_Above_Attribute);
+ Res_Type := Boolean_Type_Definition;
+ when Name_Dot =>
+ Res := Create_Iir (Iir_Kind_Dot_Attribute);
+ when Name_Integ =>
+ Res := Create_Iir (Iir_Kind_Integ_Attribute);
+ when Name_Zoh =>
+ Res := Create_Iir (Iir_Kind_Zoh_Attribute);
+ when Name_Ltf =>
+ Res := Create_Iir (Iir_Kind_Ltf_Attribute);
+ when Name_Ztf =>
+ Res := Create_Iir (Iir_Kind_Ztf_Attribute);
+ when Name_Delayed =>
+ Res := Create_Iir (Iir_Kind_Quantity_Delayed_Attribute);
+ when others =>
+ -- Not yet implemented attribute, or really an internal error.
+ raise Internal_Error;
+ end case;
+
+ Location_Copy (Res, Attr);
+ Set_Prefix (Res, Prefix);
+ Set_Type (Res, Res_Type);
+
+ -- AMS-LRM17 16.2.6 Predefined analog an mixed-signal attributes
+ -- Prefix: Any quantity denoted by the static name Q.
+ if Get_Name_Staticness (Prefix) < Globally then
+ Error_Msg_Sem
+ (+Res, "prefix of %i attribute must be a static name", +Res);
+ end if;
+
+ -- According to LRM 7.4, signal attributes are not static expressions
+ -- since the prefix (a signal) is not a static expression.
+ Set_Expr_Staticness (Res, None);
+
+ -- AMS-LRM17 8.1 Names
+ -- A name is said to be a static name if and only if one of the
+ -- following conditions holds:
+ -- [...]
+ -- - The name is an attribute whose prefix is a static quantity name
+ -- and whose suffix is one of the predefined attributes 'ABOVE, 'DOT,
+ -- 'INTEG, 'DELAYED, 'SLEW, 'LTF, 'ZOH, or 'ZTF.
+ Set_Name_Staticness (Res, Globally);
+
+ return Res;
+ end Sem_Quantity_Attribute;
+
+ function Sem_Slew_Attribute (Attr : Iir_Attribute_Name) return Iir
+ is
+ Prefix_Name : constant Iir := Get_Prefix (Attr);
+ Prefix: Iir;
+ Res : Iir;
+ Res_Type : Iir;
+ begin
+ Prefix := Get_Named_Entity (Prefix_Name);
+ if Is_Quantity_Name (Prefix) then
+ Res := Create_Iir (Iir_Kind_Quantity_Slew_Attribute);
+ elsif Is_Signal_Name (Prefix) then
+ Res := Create_Iir (Iir_Kind_Signal_Slew_Attribute);
+ else
+ Error_Msg_Sem
+ (+Attr,
+ "prefix of 'slew must denote a quantity or a signal", +Attr);
+ return Error_Mark;
+ end if;
+
+ -- AMS-VHDL17 16.2.6
+ -- Prefix: Any signal denoted by the static name S whose scalar
+ -- subelements are of a floating-point type.
+ --
+ -- GHDL: not necessary when the prefix is a quantity.
+ Res_Type := Get_Type (Prefix);
+ if not Sem_Types.Is_Nature_Type (Res_Type) then
+ Error_Msg_Sem (+Attr, "prefix of 'slew must be of nature type");
+ end if;
+
+ if Get_Name_Staticness (Prefix) < Globally then
+ Error_Msg_Sem (+Attr, "prefix of 'slew must be a static name");
+ end if;
+
+ Set_Type (Res, Res_Type);
+ Location_Copy (Res, Attr);
+ Set_Prefix (Res, Prefix);
+ Set_Expr_Staticness (Res, None);
+
+ -- AMS-LRM17 8.1 Names
+ -- A name is said to be a static name if and only if one of the
+ -- following conditions holds:
+ -- [...]
+ -- - The name is an attribute whose prefix is a static quantity name
+ -- and whose suffix is one of the predefined attributes 'ABOVE, 'DOT,
+ -- 'INTEG, 'DELAYED, 'SLEW, 'LTF, 'ZOH, or 'ZTF.
+ Set_Name_Staticness (Res, Globally);
+
+ return Res;
+ end Sem_Slew_Attribute;
+
function Sem_Signal_Signal_Attribute
(Attr : Iir_Attribute_Name; Kind : Iir_Kind)
return Iir
@@ -3736,12 +3861,20 @@ package body Vhdl.Sem_Names is
function Sem_Signal_Attribute (Attr : Iir_Attribute_Name) return Iir
is
use Std_Names;
+ Id : constant Name_Id := Get_Identifier (Attr);
Prefix: Iir;
Res : Iir;
Base : Iir;
begin
Prefix := Get_Named_Entity (Get_Prefix (Attr));
Base := Get_Object_Prefix (Prefix);
+ if AMS_Vhdl
+ and then Id = Name_Delayed
+ and then Is_Quantity_Name (Base)
+ then
+ return Sem_Quantity_Attribute (Attr);
+ end if;
+
case Get_Kind (Base) is
when Iir_Kind_Signal_Declaration
| Iir_Kind_Interface_Signal_Declaration
@@ -3753,7 +3886,7 @@ package body Vhdl.Sem_Names is
(+Attr, "prefix of %i attribute must denote a signal", +Attr);
return Error_Mark;
end case;
- case Get_Identifier (Attr) is
+ case Id is
when Name_Stable =>
Res := Sem_Signal_Signal_Attribute
(Attr, Iir_Kind_Stable_Attribute);
@@ -4024,118 +4157,6 @@ package body Vhdl.Sem_Names is
return Res;
end Sem_Name_Attribute;
- function Sem_Quantity_Attribute (Attr : Iir_Attribute_Name) return Iir
- is
- use Std_Names;
- Name_Prefix : constant Iir := Get_Prefix (Attr);
- Prefix: Iir;
- Res : Iir;
- Res_Type : Iir;
- begin
- Prefix := Get_Named_Entity (Name_Prefix);
- Prefix := Finish_Sem_Name_1 (Name_Prefix, Prefix);
- if not Is_Quantity_Name (Prefix) then
- Error_Msg_Sem
- (+Attr, "prefix of %i attribute must denote a quantity", +Attr);
- end if;
-
- Res_Type := Get_Type (Prefix);
- case Get_Identifier (Attr) is
- when Name_Above =>
- Res := Create_Iir (Iir_Kind_Above_Attribute);
- Res_Type := Boolean_Type_Definition;
- when Name_Dot =>
- Res := Create_Iir (Iir_Kind_Dot_Attribute);
- when Name_Integ =>
- Res := Create_Iir (Iir_Kind_Integ_Attribute);
- when Name_Zoh =>
- Res := Create_Iir (Iir_Kind_Zoh_Attribute);
- when Name_Ltf =>
- Res := Create_Iir (Iir_Kind_Ltf_Attribute);
- when Name_Ztf =>
- Res := Create_Iir (Iir_Kind_Ztf_Attribute);
- when others =>
- -- Not yet implemented attribute, or really an internal error.
- raise Internal_Error;
- end case;
-
- Location_Copy (Res, Attr);
- Set_Prefix (Res, Prefix);
- Set_Type (Res, Res_Type);
-
- -- AMS-LRM17 16.2.6 Predefined analog an mixed-signal attributes
- -- Prefix: Any quantity denoted by the static name Q.
- if Get_Name_Staticness (Prefix) < Globally then
- Error_Msg_Sem
- (+Res, "prefix of %i attribute must be a static name", +Res);
- end if;
-
- -- According to LRM 7.4, signal attributes are not static expressions
- -- since the prefix (a signal) is not a static expression.
- Set_Expr_Staticness (Res, None);
-
- -- AMS-LRM17 8.1 Names
- -- A name is said to be a static name if and only if one of the
- -- following conditions holds:
- -- [...]
- -- - The name is an attribute whose prefix is a static quantity name
- -- and whose suffix is one of the predefined attributes 'ABOVE, 'DOT,
- -- 'INTEG, 'DELAYED, 'SLEW, 'LTF, 'ZOH, or 'ZTF.
- Set_Name_Staticness (Res, Globally);
-
- return Res;
- end Sem_Quantity_Attribute;
-
- function Sem_Slew_Attribute (Attr : Iir_Attribute_Name) return Iir
- is
- Prefix_Name : constant Iir := Get_Prefix (Attr);
- Prefix: Iir;
- Res : Iir;
- Res_Type : Iir;
- begin
- Prefix := Get_Named_Entity (Prefix_Name);
- if Is_Quantity_Name (Prefix) then
- Res := Create_Iir (Iir_Kind_Quantity_Slew_Attribute);
- elsif Is_Signal_Name (Prefix) then
- Res := Create_Iir (Iir_Kind_Signal_Slew_Attribute);
- else
- Error_Msg_Sem
- (+Attr,
- "prefix of 'slew must denote a quantity or a signal", +Attr);
- return Error_Mark;
- end if;
-
- -- AMS-VHDL17 16.2.6
- -- Prefix: Any signal denoted by the static name S whose scalar
- -- subelements are of a floating-point type.
- --
- -- GHDL: not necessary when the prefix is a quantity.
- Res_Type := Get_Type (Prefix);
- if not Sem_Types.Is_Nature_Type (Res_Type) then
- Error_Msg_Sem (+Attr, "prefix of 'slew must be of nature type");
- end if;
-
- if Get_Name_Staticness (Prefix) < Globally then
- Error_Msg_Sem (+Attr, "prefix of 'slew must be a static name");
- end if;
-
- Set_Type (Res, Res_Type);
- Location_Copy (Res, Attr);
- Set_Prefix (Res, Prefix);
- Set_Expr_Staticness (Res, None);
-
- -- AMS-LRM17 8.1 Names
- -- A name is said to be a static name if and only if one of the
- -- following conditions holds:
- -- [...]
- -- - The name is an attribute whose prefix is a static quantity name
- -- and whose suffix is one of the predefined attributes 'ABOVE, 'DOT,
- -- 'INTEG, 'DELAYED, 'SLEW, 'LTF, 'ZOH, or 'ZTF.
- Set_Name_Staticness (Res, Globally);
-
- return Res;
- end Sem_Slew_Attribute;
-
procedure Sem_Attribute_Name (Attr : Iir_Attribute_Name)
is
use Std_Names;
@@ -4682,7 +4703,8 @@ package body Vhdl.Sem_Names is
| Iir_Kind_Ltf_Attribute
| Iir_Kind_Ztf_Attribute
| Iir_Kind_Signal_Slew_Attribute
- | Iir_Kind_Quantity_Slew_Attribute =>
+ | Iir_Kind_Quantity_Slew_Attribute
+ | Iir_Kind_Quantity_Delayed_Attribute =>
-- Never static
return Res;
when Iir_Kinds_Type_Attribute