diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/psl/psl-nodes.adb.in | 388 | ||||
-rw-r--r-- | src/psl/psl-nodes_meta.adb | 1305 | ||||
-rw-r--r-- | src/psl/psl-nodes_meta.adb.in | 76 | ||||
-rw-r--r-- | src/psl/psl-nodes_meta.ads | 174 | ||||
-rw-r--r-- | src/psl/psl-nodes_meta.ads.in | 65 |
5 files changed, 2008 insertions, 0 deletions
diff --git a/src/psl/psl-nodes.adb.in b/src/psl/psl-nodes.adb.in new file mode 100644 index 000000000..775e1d911 --- /dev/null +++ b/src/psl/psl-nodes.adb.in @@ -0,0 +1,388 @@ +-- This is in fact -*- Ada -*- +with Ada.Unchecked_Conversion; +with GNAT.Table; +with PSL.Errors; +with PSL.Hash; +with PSL.Nodes_Meta; use PSL.Nodes_Meta; + +package body PSL.Nodes is + -- Suppress the access check of the table base. This is really safe to + -- suppress this check because the table base cannot be null. + pragma Suppress (Access_Check); + + -- Suppress the index check on the table. + -- Could be done during non-debug, since this may catch errors (reading + -- Null_Node. + --pragma Suppress (Index_Check); + + type Format_Type is + ( + Format_Short + ); + + -- Common fields are: + -- Flag1 : Boolean + -- Flag2 : Boolean + -- Flag3 : Boolean + -- Flag4 : Boolean + -- Flag5 : Boolean + -- Flag6 : Boolean + -- Nkind : Kind_Type + -- State1 : Bit2_Type + -- State2 : Bit2_Type + -- Location : Int32 + -- Field1 : Node + -- Field2 : Node + -- Field3 : Node + -- Field4 : Node + + -- Fields of Format_Short: + -- Field5 : Node + -- Field6 : Node + + type State_Type is range 0 .. 3; + type Bit3_Type is range 0 .. 7; + + type Node_Record is record + Kind : Nkind; + Flag1 : Boolean; + Flag2 : Boolean; + Flag3 : Boolean; + Flag4 : Boolean; + Flag5 : Boolean; + Flag6 : Boolean; + Flag7 : Boolean; + Flag8 : Boolean; + Flag9 : Boolean; + Flag10 : Boolean; + Flag11 : Boolean; + Flag12 : Boolean; + Flag13 : Boolean; + Flag14 : Boolean; + Flag15 : Boolean; + Flag16 : Boolean; + State1 : State_Type; + B3_1 : Bit3_Type; + Flag17 : Boolean; + Flag18 : Boolean; + Flag19 : Boolean; + + Location : Int32; + Field1 : Node; + Field2 : Node; + Field3 : Node; + Field4 : Node; + Field5 : Node; + Field6 : Node; + end record; + pragma Pack (Node_Record); + for Node_Record'Size use 8 * 32; + + package Nodet is new GNAT.Table + (Table_Component_Type => Node_Record, + Table_Index_Type => Node, + Table_Low_Bound => 1, + Table_Initial => 1024, + Table_Increment => 100); + + Init_Node : constant Node_Record := (Kind => N_Error, + Flag1 => False, + Flag2 => False, + State1 => 0, + B3_1 => 0, + Location => 0, + Field1 => 0, + Field2 => 0, + Field3 => 0, + Field4 => 0, + Field5 => 0, + Field6 => 0, + others => False); + + Free_Nodes : Node := Null_Node; + + + function Get_Last_Node return Node is + begin + return Nodet.Last; + end Get_Last_Node; + + function Node_To_Uns32 is new Ada.Unchecked_Conversion + (Source => Node, Target => Uns32); + + function Uns32_To_Node is new Ada.Unchecked_Conversion + (Source => Uns32, Target => Node); + + function Node_To_Int32 is new Ada.Unchecked_Conversion + (Source => Node, Target => Int32); + + function Int32_To_Node is new Ada.Unchecked_Conversion + (Source => Int32, Target => Node); + + function Node_To_NFA is new Ada.Unchecked_Conversion + (Source => Node, Target => NFA); + + function NFA_To_Node is new Ada.Unchecked_Conversion + (Source => NFA, Target => Node); + + function Node_To_HDL_Node is new Ada.Unchecked_Conversion + (Source => Node, Target => HDL_Node); + + function HDL_Node_To_Node is new Ada.Unchecked_Conversion + (Source => HDL_Node, Target => Node); + + procedure Set_Kind (N : Node; K : Nkind) is + begin + Nodet.Table (N).Kind := K; + end Set_Kind; + + function Get_Kind (N : Node) return Nkind is + begin + return Nodet.Table (N).Kind; + end Get_Kind; + + + procedure Set_Flag1 (N : Node; Flag : Boolean) is + begin + Nodet.Table (N).Flag1 := Flag; + end Set_Flag1; + + function Get_Flag1 (N : Node) return Boolean is + begin + return Nodet.Table (N).Flag1; + end Get_Flag1; + + procedure Set_Flag2 (N : Node; Flag : Boolean) is + begin + Nodet.Table (N).Flag2 := Flag; + end Set_Flag2; + + function Get_Flag2 (N : Node) return Boolean is + begin + return Nodet.Table (N).Flag2; + end Get_Flag2; + + + procedure Set_State1 (N : Node; S : State_Type) is + begin + Nodet.Table (N).State1 := S; + end Set_State1; + + function Get_State1 (N : Node) return State_Type is + begin + return Nodet.Table (N).State1; + end Get_State1; + + + function Get_Location (N : Node) return Location_Type is + begin + return Location_Type (Nodet.Table (N).Location); + end Get_Location; + + procedure Set_Location (N : Node; Loc : Location_Type) is + begin + Nodet.Table (N).Location := Int32 (Loc); + end Set_Location; + + + procedure Set_Field1 (N : Node; V : Node) is + begin + Nodet.Table (N).Field1 := V; + end Set_Field1; + + function Get_Field1 (N : Node) return Node is + begin + return Nodet.Table (N).Field1; + end Get_Field1; + + + procedure Set_Field2 (N : Node; V : Node) is + begin + Nodet.Table (N).Field2 := V; + end Set_Field2; + + function Get_Field2 (N : Node) return Node is + begin + return Nodet.Table (N).Field2; + end Get_Field2; + + + function Get_Field3 (N : Node) return Node is + begin + return Nodet.Table (N).Field3; + end Get_Field3; + + procedure Set_Field3 (N : Node; V : Node) is + begin + Nodet.Table (N).Field3 := V; + end Set_Field3; + + + function Get_Field4 (N : Node) return Node is + begin + return Nodet.Table (N).Field4; + end Get_Field4; + + procedure Set_Field4 (N : Node; V : Node) is + begin + Nodet.Table (N).Field4 := V; + end Set_Field4; + + + function Get_Field5 (N : Node) return Node is + begin + return Nodet.Table (N).Field5; + end Get_Field5; + + procedure Set_Field5 (N : Node; V : Node) is + begin + Nodet.Table (N).Field5 := V; + end Set_Field5; + + + function Get_Field6 (N : Node) return Node is + begin + return Nodet.Table (N).Field6; + end Get_Field6; + + procedure Set_Field6 (N : Node; V : Node) is + begin + Nodet.Table (N).Field6 := V; + end Set_Field6; + + + function Get_Format (Kind : Nkind) return Format_Type; + pragma Unreferenced (Get_Format); + + function Create_Node (Kind : Nkind) return Node + is + Res : Node; + begin + if Free_Nodes /= Null_Node then + Res := Free_Nodes; + Free_Nodes := Get_Field1 (Res); + else + Nodet.Increment_Last; + Res := Nodet.Last; + end if; + Nodet.Table (Res) := Init_Node; + Set_Kind (Res, Kind); + return Res; + end Create_Node; + + procedure Free_Node (N : Node) + is + begin + Set_Kind (N, N_Error); + Set_Field1 (N, Free_Nodes); + Free_Nodes := N; + end Free_Node; + + procedure Failed (Msg : String; N : Node) + is + begin + Errors.Error_Kind (Msg, N); + end Failed; + + procedure Init is + begin + Nodet.Init; + if Create_Node (N_False) /= False_Node then + raise Internal_Error; + end if; + if Create_Node (N_True) /= True_Node then + raise Internal_Error; + end if; + if Create_Node (N_Number) /= One_Node then + raise Internal_Error; + end if; + Set_Value (One_Node, 1); + if Create_Node (N_EOS) /= EOS_Node then + raise Internal_Error; + end if; + Set_Hash (EOS_Node, 0); + PSL.Hash.Init; + end Init; + + function Get_Psl_Type (N : Node) return PSL_Types is + begin + case Get_Kind (N) is + when N_And_Prop + | N_Or_Prop + | N_Log_Imp_Prop + | N_Always + | N_Never + | N_Eventually + | N_Next + | N_Next_E + | N_Next_A + | N_Next_Event + | N_Next_Event_A + | N_Next_Event_E + | N_Before + | N_Until + | N_Abort + | N_Strong + | N_Property_Parameter + | N_Property_Instance => + return Type_Property; + when N_Braced_SERE + | N_Concat_SERE + | N_Fusion_SERE + | N_Within_SERE + | N_Overlap_Imp_Seq + | N_Imp_Seq + | N_And_Seq + | N_Or_Seq + | N_Match_And_Seq + | N_Star_Repeat_Seq + | N_Goto_Repeat_Seq + | N_Equal_Repeat_Seq + | N_Plus_Repeat_Seq + | N_Clock_Event + | N_Sequence_Instance + | N_Endpoint_Instance + | N_Sequence_Parameter => + return Type_Sequence; + when N_Name => + return Get_Psl_Type (Get_Decl (N)); + when N_HDL_Expr => + -- FIXME. + return Type_Boolean; + when N_Or_Bool + | N_And_Bool + | N_Not_Bool + | N_Imp_Bool + | N_False + | N_True + | N_Boolean_Parameter => + return Type_Boolean; + when N_Number + | N_Const_Parameter => + return Type_Numeric; + when N_Vmode + | N_Vunit + | N_Vprop + | N_Hdl_Mod_Name + | N_Assert_Directive + | N_Sequence_Declaration + | N_Endpoint_Declaration + | N_Property_Declaration + | N_Actual + | N_Name_Decl + | N_Error + | N_EOS => + PSL.Errors.Error_Kind ("get_psl_type", N); + end case; + end Get_Psl_Type; + + procedure Reference_Failed (Msg : String; N : Node) is + begin + Failed (Msg, N); + end Reference_Failed; + pragma Unreferenced (Reference_Failed); + + -- Subprograms + +end PSL.Nodes; + diff --git a/src/psl/psl-nodes_meta.adb b/src/psl/psl-nodes_meta.adb new file mode 100644 index 000000000..2ef5db9b0 --- /dev/null +++ b/src/psl/psl-nodes_meta.adb @@ -0,0 +1,1305 @@ +-- Meta description of nodes. +-- Copyright (C) 2015 Tristan Gingold +-- +-- GHDL is free software; you can redistribute it and/or modify it under +-- the terms of the GNU General Public License as published by the Free +-- Software Foundation; either version 2, or (at your option) any later +-- version. +-- +-- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY +-- WARRANTY; without even the implied warranty of MERCHANTABILITY or +-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-- for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with GHDL; see the file COPYING. If not, write to the Free +-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA +-- 02111-1307, USA. + +package body PSL.Nodes_Meta is + Fields_Type : constant array (Fields_Enum) of Types_Enum := + ( + Field_Identifier => Type_Name_Id, + Field_Label => Type_Name_Id, + Field_Chain => Type_Node, + Field_Instance => Type_Node, + Field_Prefix => Type_Node, + Field_Item_Chain => Type_Node, + Field_Property => Type_Node, + Field_String => Type_Node, + Field_SERE => Type_Node, + Field_Left => Type_Node, + Field_Right => Type_Node, + Field_Sequence => Type_Node, + Field_Strong_Flag => Type_Boolean, + Field_Inclusive_Flag => Type_Boolean, + Field_Low_Bound => Type_Node, + Field_High_Bound => Type_Node, + Field_Number => Type_Node, + Field_Value => Type_Uns32, + Field_Boolean => Type_Node, + Field_Decl => Type_Node, + Field_HDL_Node => Type_HDL_Node, + Field_Hash => Type_Uns32, + Field_Hash_Link => Type_Node, + Field_HDL_Index => Type_Int32, + Field_Presence => Type_PSL_Presence_Kind, + Field_NFA => Type_NFA, + Field_Parameter_List => Type_Node, + Field_Actual => Type_Node, + Field_Formal => Type_Node, + Field_Declaration => Type_Node, + Field_Association_Chain => Type_Node, + Field_Global_Clock => Type_Node + ); + + function Get_Field_Type (F : Fields_Enum) return Types_Enum is + begin + return Fields_Type (F); + end Get_Field_Type; + + function Get_Field_Image (F : Fields_Enum) return String is + begin + case F is + when Field_Identifier => + return "identifier"; + when Field_Label => + return "label"; + when Field_Chain => + return "chain"; + when Field_Instance => + return "instance"; + when Field_Prefix => + return "prefix"; + when Field_Item_Chain => + return "item_chain"; + when Field_Property => + return "property"; + when Field_String => + return "string"; + when Field_SERE => + return "sere"; + when Field_Left => + return "left"; + when Field_Right => + return "right"; + when Field_Sequence => + return "sequence"; + when Field_Strong_Flag => + return "strong_flag"; + when Field_Inclusive_Flag => + return "inclusive_flag"; + when Field_Low_Bound => + return "low_bound"; + when Field_High_Bound => + return "high_bound"; + when Field_Number => + return "number"; + when Field_Value => + return "value"; + when Field_Boolean => + return "boolean"; + when Field_Decl => + return "decl"; + when Field_HDL_Node => + return "hdl_node"; + when Field_Hash => + return "hash"; + when Field_Hash_Link => + return "hash_link"; + when Field_HDL_Index => + return "hdl_index"; + when Field_Presence => + return "presence"; + when Field_NFA => + return "nfa"; + when Field_Parameter_List => + return "parameter_list"; + when Field_Actual => + return "actual"; + when Field_Formal => + return "formal"; + when Field_Declaration => + return "declaration"; + when Field_Association_Chain => + return "association_chain"; + when Field_Global_Clock => + return "global_clock"; + end case; + end Get_Field_Image; + + function Get_Nkind_Image (K : Nkind) return String is + begin + case K is + when N_Error => + return "error"; + when N_Vmode => + return "vmode"; + when N_Vunit => + return "vunit"; + when N_Vprop => + return "vprop"; + when N_Hdl_Mod_Name => + return "hdl_mod_name"; + when N_Assert_Directive => + return "assert_directive"; + when N_Property_Declaration => + return "property_declaration"; + when N_Sequence_Declaration => + return "sequence_declaration"; + when N_Endpoint_Declaration => + return "endpoint_declaration"; + when N_Const_Parameter => + return "const_parameter"; + when N_Boolean_Parameter => + return "boolean_parameter"; + when N_Property_Parameter => + return "property_parameter"; + when N_Sequence_Parameter => + return "sequence_parameter"; + when N_Sequence_Instance => + return "sequence_instance"; + when N_Endpoint_Instance => + return "endpoint_instance"; + when N_Property_Instance => + return "property_instance"; + when N_Actual => + return "actual"; + when N_Clock_Event => + return "clock_event"; + when N_Always => + return "always"; + when N_Never => + return "never"; + when N_Eventually => + return "eventually"; + when N_Strong => + return "strong"; + when N_Imp_Seq => + return "imp_seq"; + when N_Overlap_Imp_Seq => + return "overlap_imp_seq"; + when N_Log_Imp_Prop => + return "log_imp_prop"; + when N_Next => + return "next"; + when N_Next_A => + return "next_a"; + when N_Next_E => + return "next_e"; + when N_Next_Event => + return "next_event"; + when N_Next_Event_A => + return "next_event_a"; + when N_Next_Event_E => + return "next_event_e"; + when N_Abort => + return "abort"; + when N_Until => + return "until"; + when N_Before => + return "before"; + when N_Or_Prop => + return "or_prop"; + when N_And_Prop => + return "and_prop"; + when N_Braced_SERE => + return "braced_sere"; + when N_Concat_SERE => + return "concat_sere"; + when N_Fusion_SERE => + return "fusion_sere"; + when N_Within_SERE => + return "within_sere"; + when N_Match_And_Seq => + return "match_and_seq"; + when N_And_Seq => + return "and_seq"; + when N_Or_Seq => + return "or_seq"; + when N_Star_Repeat_Seq => + return "star_repeat_seq"; + when N_Goto_Repeat_Seq => + return "goto_repeat_seq"; + when N_Plus_Repeat_Seq => + return "plus_repeat_seq"; + when N_Equal_Repeat_Seq => + return "equal_repeat_seq"; + when N_Not_Bool => + return "not_bool"; + when N_And_Bool => + return "and_bool"; + when N_Or_Bool => + return "or_bool"; + when N_Imp_Bool => + return "imp_bool"; + when N_HDL_Expr => + return "hdl_expr"; + when N_False => + return "false"; + when N_True => + return "true"; + when N_EOS => + return "eos"; + when N_Name => + return "name"; + when N_Name_Decl => + return "name_decl"; + when N_Number => + return "number"; + end case; + end Get_Nkind_Image; + + function Get_Field_Attribute (F : Fields_Enum) return Field_Attribute is + begin + case F is + when Field_Identifier => + return Attr_None; + when Field_Label => + return Attr_None; + when Field_Chain => + return Attr_Chain; + when Field_Instance => + return Attr_None; + when Field_Prefix => + return Attr_None; + when Field_Item_Chain => + return Attr_None; + when Field_Property => + return Attr_None; + when Field_String => + return Attr_None; + when Field_SERE => + return Attr_None; + when Field_Left => + return Attr_None; + when Field_Right => + return Attr_None; + when Field_Sequence => + return Attr_None; + when Field_Strong_Flag => + return Attr_None; + when Field_Inclusive_Flag => + return Attr_None; + when Field_Low_Bound => + return Attr_None; + when Field_High_Bound => + return Attr_None; + when Field_Number => + return Attr_None; + when Field_Value => + return Attr_None; + when Field_Boolean => + return Attr_None; + when Field_Decl => + return Attr_None; + when Field_HDL_Node => + return Attr_None; + when Field_Hash => + return Attr_None; + when Field_Hash_Link => + return Attr_None; + when Field_HDL_Index => + return Attr_None; + when Field_Presence => + return Attr_None; + when Field_NFA => + return Attr_None; + when Field_Parameter_List => + return Attr_None; + when Field_Actual => + return Attr_None; + when Field_Formal => + return Attr_None; + when Field_Declaration => + return Attr_Ref; + when Field_Association_Chain => + return Attr_None; + when Field_Global_Clock => + return Attr_None; + end case; + end Get_Field_Attribute; + + Fields_Of_Nodes : constant Fields_Array := + ( + -- N_Error + -- N_Vmode + Field_Identifier, + Field_Chain, + Field_Instance, + Field_Item_Chain, + -- N_Vunit + Field_Identifier, + Field_Chain, + Field_Instance, + Field_Item_Chain, + -- N_Vprop + Field_Identifier, + Field_Chain, + Field_Instance, + Field_Item_Chain, + -- N_Hdl_Mod_Name + Field_Identifier, + Field_Prefix, + -- N_Assert_Directive + Field_Label, + Field_Chain, + Field_String, + Field_Property, + Field_NFA, + -- N_Property_Declaration + Field_Identifier, + Field_Chain, + Field_Global_Clock, + Field_Property, + Field_Parameter_List, + -- N_Sequence_Declaration + Field_Identifier, + Field_Chain, + Field_Sequence, + Field_Parameter_List, + -- N_Endpoint_Declaration + Field_Identifier, + Field_Chain, + Field_Sequence, + Field_Parameter_List, + -- N_Const_Parameter + Field_Identifier, + Field_Chain, + Field_Actual, + -- N_Boolean_Parameter + Field_Identifier, + Field_Chain, + Field_Actual, + -- N_Property_Parameter + Field_Identifier, + Field_Chain, + Field_Actual, + -- N_Sequence_Parameter + Field_Identifier, + Field_Chain, + Field_Actual, + -- N_Sequence_Instance + Field_Declaration, + Field_Association_Chain, + -- N_Endpoint_Instance + Field_Declaration, + Field_Association_Chain, + -- N_Property_Instance + Field_Declaration, + Field_Association_Chain, + -- N_Actual + Field_Chain, + Field_Actual, + Field_Formal, + -- N_Clock_Event + Field_Property, + Field_Boolean, + -- N_Always + Field_Property, + -- N_Never + Field_Property, + -- N_Eventually + Field_Property, + -- N_Strong + Field_Property, + -- N_Imp_Seq + Field_Sequence, + Field_Property, + -- N_Overlap_Imp_Seq + Field_Sequence, + Field_Property, + -- N_Log_Imp_Prop + Field_Left, + Field_Right, + -- N_Next + Field_Strong_Flag, + Field_Number, + Field_Property, + -- N_Next_A + Field_Strong_Flag, + Field_Low_Bound, + Field_High_Bound, + Field_Property, + -- N_Next_E + Field_Strong_Flag, + Field_Low_Bound, + Field_High_Bound, + Field_Property, + -- N_Next_Event + Field_Strong_Flag, + Field_Number, + Field_Property, + Field_Boolean, + -- N_Next_Event_A + Field_Strong_Flag, + Field_Low_Bound, + Field_High_Bound, + Field_Property, + Field_Boolean, + -- N_Next_Event_E + Field_Strong_Flag, + Field_Low_Bound, + Field_High_Bound, + Field_Property, + Field_Boolean, + -- N_Abort + Field_Property, + Field_Boolean, + -- N_Until + Field_Strong_Flag, + Field_Inclusive_Flag, + Field_Left, + Field_Right, + -- N_Before + Field_Strong_Flag, + Field_Inclusive_Flag, + Field_Left, + Field_Right, + -- N_Or_Prop + Field_Left, + Field_Right, + -- N_And_Prop + Field_Left, + Field_Right, + -- N_Braced_SERE + Field_SERE, + -- N_Concat_SERE + Field_Left, + Field_Right, + -- N_Fusion_SERE + Field_Left, + Field_Right, + -- N_Within_SERE + Field_Left, + Field_Right, + -- N_Match_And_Seq + Field_Left, + Field_Right, + -- N_And_Seq + Field_Left, + Field_Right, + -- N_Or_Seq + Field_Left, + Field_Right, + -- N_Star_Repeat_Seq + Field_Sequence, + Field_Low_Bound, + Field_High_Bound, + -- N_Goto_Repeat_Seq + Field_Sequence, + Field_Low_Bound, + Field_High_Bound, + -- N_Plus_Repeat_Seq + Field_Sequence, + -- N_Equal_Repeat_Seq + Field_Sequence, + Field_Low_Bound, + Field_High_Bound, + -- N_Not_Bool + Field_Presence, + Field_Boolean, + Field_Hash, + Field_Hash_Link, + -- N_And_Bool + Field_Presence, + Field_Left, + Field_Right, + Field_Hash, + Field_Hash_Link, + -- N_Or_Bool + Field_Presence, + Field_Left, + Field_Right, + Field_Hash, + Field_Hash_Link, + -- N_Imp_Bool + Field_Presence, + Field_Left, + Field_Right, + Field_Hash, + Field_Hash_Link, + -- N_HDL_Expr + Field_Presence, + Field_HDL_Node, + Field_HDL_Index, + Field_Hash, + Field_Hash_Link, + -- N_False + -- N_True + -- N_EOS + Field_HDL_Index, + Field_Hash, + Field_Hash_Link, + -- N_Name + Field_Identifier, + Field_Decl, + -- N_Name_Decl + Field_Identifier, + Field_Chain, + -- N_Number + Field_Value + ); + + Fields_Of_Nodes_Last : constant array (Nkind) of Integer := + ( + N_Error => -1, + N_Vmode => 3, + N_Vunit => 7, + N_Vprop => 11, + N_Hdl_Mod_Name => 13, + N_Assert_Directive => 18, + N_Property_Declaration => 23, + N_Sequence_Declaration => 27, + N_Endpoint_Declaration => 31, + N_Const_Parameter => 34, + N_Boolean_Parameter => 37, + N_Property_Parameter => 40, + N_Sequence_Parameter => 43, + N_Sequence_Instance => 45, + N_Endpoint_Instance => 47, + N_Property_Instance => 49, + N_Actual => 52, + N_Clock_Event => 54, + N_Always => 55, + N_Never => 56, + N_Eventually => 57, + N_Strong => 58, + N_Imp_Seq => 60, + N_Overlap_Imp_Seq => 62, + N_Log_Imp_Prop => 64, + N_Next => 67, + N_Next_A => 71, + N_Next_E => 75, + N_Next_Event => 79, + N_Next_Event_A => 84, + N_Next_Event_E => 89, + N_Abort => 91, + N_Until => 95, + N_Before => 99, + N_Or_Prop => 101, + N_And_Prop => 103, + N_Braced_SERE => 104, + N_Concat_SERE => 106, + N_Fusion_SERE => 108, + N_Within_SERE => 110, + N_Match_And_Seq => 112, + N_And_Seq => 114, + N_Or_Seq => 116, + N_Star_Repeat_Seq => 119, + N_Goto_Repeat_Seq => 122, + N_Plus_Repeat_Seq => 123, + N_Equal_Repeat_Seq => 126, + N_Not_Bool => 130, + N_And_Bool => 135, + N_Or_Bool => 140, + N_Imp_Bool => 145, + N_HDL_Expr => 150, + N_False => 150, + N_True => 150, + N_EOS => 153, + N_Name => 155, + N_Name_Decl => 157, + N_Number => 158 + ); + + function Get_Fields (K : Nkind) return Fields_Array + is + First : Natural; + Last : Integer; + begin + if K = Nkind'First then + First := Fields_Of_Nodes'First; + else + First := Fields_Of_Nodes_Last (Nkind'Pred (K)) + 1; + end if; + Last := Fields_Of_Nodes_Last (K); + return Fields_Of_Nodes (First .. Last); + end Get_Fields; + + function Get_Boolean + (N : Node; F : Fields_Enum) return Boolean is + begin + pragma Assert (Fields_Type (F) = Type_Boolean); + case F is + when Field_Strong_Flag => + return Get_Strong_Flag (N); + when Field_Inclusive_Flag => + return Get_Inclusive_Flag (N); + when others => + raise Internal_Error; + end case; + end Get_Boolean; + + procedure Set_Boolean + (N : Node; F : Fields_Enum; V: Boolean) is + begin + pragma Assert (Fields_Type (F) = Type_Boolean); + case F is + when Field_Strong_Flag => + Set_Strong_Flag (N, V); + when Field_Inclusive_Flag => + Set_Inclusive_Flag (N, V); + when others => + raise Internal_Error; + end case; + end Set_Boolean; + + function Get_HDL_Node + (N : Node; F : Fields_Enum) return HDL_Node is + begin + pragma Assert (Fields_Type (F) = Type_HDL_Node); + case F is + when Field_HDL_Node => + return Get_HDL_Node (N); + when others => + raise Internal_Error; + end case; + end Get_HDL_Node; + + procedure Set_HDL_Node + (N : Node; F : Fields_Enum; V: HDL_Node) is + begin + pragma Assert (Fields_Type (F) = Type_HDL_Node); + case F is + when Field_HDL_Node => + Set_HDL_Node (N, V); + when others => + raise Internal_Error; + end case; + end Set_HDL_Node; + + function Get_Int32 + (N : Node; F : Fields_Enum) return Int32 is + begin + pragma Assert (Fields_Type (F) = Type_Int32); + case F is + when Field_HDL_Index => + return Get_HDL_Index (N); + when others => + raise Internal_Error; + end case; + end Get_Int32; + + procedure Set_Int32 + (N : Node; F : Fields_Enum; V: Int32) is + begin + pragma Assert (Fields_Type (F) = Type_Int32); + case F is + when Field_HDL_Index => + Set_HDL_Index (N, V); + when others => + raise Internal_Error; + end case; + end Set_Int32; + + function Get_NFA + (N : Node; F : Fields_Enum) return NFA is + begin + pragma Assert (Fields_Type (F) = Type_NFA); + case F is + when Field_NFA => + return Get_NFA (N); + when others => + raise Internal_Error; + end case; + end Get_NFA; + + procedure Set_NFA + (N : Node; F : Fields_Enum; V: NFA) is + begin + pragma Assert (Fields_Type (F) = Type_NFA); + case F is + when Field_NFA => + Set_NFA (N, V); + when others => + raise Internal_Error; + end case; + end Set_NFA; + + function Get_Name_Id + (N : Node; F : Fields_Enum) return Name_Id is + begin + pragma Assert (Fields_Type (F) = Type_Name_Id); + case F is + when Field_Identifier => + return Get_Identifier (N); + when Field_Label => + return Get_Label (N); + when others => + raise Internal_Error; + end case; + end Get_Name_Id; + + procedure Set_Name_Id + (N : Node; F : Fields_Enum; V: Name_Id) is + begin + pragma Assert (Fields_Type (F) = Type_Name_Id); + case F is + when Field_Identifier => + Set_Identifier (N, V); + when Field_Label => + Set_Label (N, V); + when others => + raise Internal_Error; + end case; + end Set_Name_Id; + + function Get_Node + (N : Node; F : Fields_Enum) return Node is + begin + pragma Assert (Fields_Type (F) = Type_Node); + case F is + when Field_Chain => + return Get_Chain (N); + when Field_Instance => + return Get_Instance (N); + when Field_Prefix => + return Get_Prefix (N); + when Field_Item_Chain => + return Get_Item_Chain (N); + when Field_Property => + return Get_Property (N); + when Field_String => + return Get_String (N); + when Field_SERE => + return Get_SERE (N); + when Field_Left => + return Get_Left (N); + when Field_Right => + return Get_Right (N); + when Field_Sequence => + return Get_Sequence (N); + when Field_Low_Bound => + return Get_Low_Bound (N); + when Field_High_Bound => + return Get_High_Bound (N); + when Field_Number => + return Get_Number (N); + when Field_Boolean => + return Get_Boolean (N); + when Field_Decl => + return Get_Decl (N); + when Field_Hash_Link => + return Get_Hash_Link (N); + when Field_Parameter_List => + return Get_Parameter_List (N); + when Field_Actual => + return Get_Actual (N); + when Field_Formal => + return Get_Formal (N); + when Field_Declaration => + return Get_Declaration (N); + when Field_Association_Chain => + return Get_Association_Chain (N); + when Field_Global_Clock => + return Get_Global_Clock (N); + when others => + raise Internal_Error; + end case; + end Get_Node; + + procedure Set_Node + (N : Node; F : Fields_Enum; V: Node) is + begin + pragma Assert (Fields_Type (F) = Type_Node); + case F is + when Field_Chain => + Set_Chain (N, V); + when Field_Instance => + Set_Instance (N, V); + when Field_Prefix => + Set_Prefix (N, V); + when Field_Item_Chain => + Set_Item_Chain (N, V); + when Field_Property => + Set_Property (N, V); + when Field_String => + Set_String (N, V); + when Field_SERE => + Set_SERE (N, V); + when Field_Left => + Set_Left (N, V); + when Field_Right => + Set_Right (N, V); + when Field_Sequence => + Set_Sequence (N, V); + when Field_Low_Bound => + Set_Low_Bound (N, V); + when Field_High_Bound => + Set_High_Bound (N, V); + when Field_Number => + Set_Number (N, V); + when Field_Boolean => + Set_Boolean (N, V); + when Field_Decl => + Set_Decl (N, V); + when Field_Hash_Link => + Set_Hash_Link (N, V); + when Field_Parameter_List => + Set_Parameter_List (N, V); + when Field_Actual => + Set_Actual (N, V); + when Field_Formal => + Set_Formal (N, V); + when Field_Declaration => + Set_Declaration (N, V); + when Field_Association_Chain => + Set_Association_Chain (N, V); + when Field_Global_Clock => + Set_Global_Clock (N, V); + when others => + raise Internal_Error; + end case; + end Set_Node; + + function Get_PSL_Presence_Kind + (N : Node; F : Fields_Enum) return PSL_Presence_Kind is + begin + pragma Assert (Fields_Type (F) = Type_PSL_Presence_Kind); + case F is + when Field_Presence => + return Get_Presence (N); + when others => + raise Internal_Error; + end case; + end Get_PSL_Presence_Kind; + + procedure Set_PSL_Presence_Kind + (N : Node; F : Fields_Enum; V: PSL_Presence_Kind) is + begin + pragma Assert (Fields_Type (F) = Type_PSL_Presence_Kind); + case F is + when Field_Presence => + Set_Presence (N, V); + when others => + raise Internal_Error; + end case; + end Set_PSL_Presence_Kind; + + function Get_Uns32 + (N : Node; F : Fields_Enum) return Uns32 is + begin + pragma Assert (Fields_Type (F) = Type_Uns32); + case F is + when Field_Value => + return Get_Value (N); + when Field_Hash => + return Get_Hash (N); + when others => + raise Internal_Error; + end case; + end Get_Uns32; + + procedure Set_Uns32 + (N : Node; F : Fields_Enum; V: Uns32) is + begin + pragma Assert (Fields_Type (F) = Type_Uns32); + case F is + when Field_Value => + Set_Value (N, V); + when Field_Hash => + Set_Hash (N, V); + when others => + raise Internal_Error; + end case; + end Set_Uns32; + + function Has_Identifier (K : Nkind) return Boolean is + begin + case K is + when N_Vmode + | N_Vunit + | N_Vprop + | N_Hdl_Mod_Name + | N_Property_Declaration + | N_Sequence_Declaration + | N_Endpoint_Declaration + | N_Const_Parameter + | N_Boolean_Parameter + | N_Property_Parameter + | N_Sequence_Parameter + | N_Name + | N_Name_Decl => + return True; + when others => + return False; + end case; + end Has_Identifier; + + function Has_Label (K : Nkind) return Boolean is + begin + return K = N_Assert_Directive; + end Has_Label; + + function Has_Chain (K : Nkind) return Boolean is + begin + case K is + when N_Vmode + | N_Vunit + | N_Vprop + | N_Assert_Directive + | N_Property_Declaration + | N_Sequence_Declaration + | N_Endpoint_Declaration + | N_Const_Parameter + | N_Boolean_Parameter + | N_Property_Parameter + | N_Sequence_Parameter + | N_Actual + | N_Name_Decl => + return True; + when others => + return False; + end case; + end Has_Chain; + + function Has_Instance (K : Nkind) return Boolean is + begin + case K is + when N_Vmode + | N_Vunit + | N_Vprop => + return True; + when others => + return False; + end case; + end Has_Instance; + + function Has_Prefix (K : Nkind) return Boolean is + begin + return K = N_Hdl_Mod_Name; + end Has_Prefix; + + function Has_Item_Chain (K : Nkind) return Boolean is + begin + case K is + when N_Vmode + | N_Vunit + | N_Vprop => + return True; + when others => + return False; + end case; + end Has_Item_Chain; + + function Has_Property (K : Nkind) return Boolean is + begin + case K is + when N_Assert_Directive + | N_Property_Declaration + | N_Clock_Event + | N_Always + | N_Never + | N_Eventually + | N_Strong + | N_Imp_Seq + | N_Overlap_Imp_Seq + | N_Next + | N_Next_A + | N_Next_E + | N_Next_Event + | N_Next_Event_A + | N_Next_Event_E + | N_Abort => + return True; + when others => + return False; + end case; + end Has_Property; + + function Has_String (K : Nkind) return Boolean is + begin + return K = N_Assert_Directive; + end Has_String; + + function Has_SERE (K : Nkind) return Boolean is + begin + return K = N_Braced_SERE; + end Has_SERE; + + function Has_Left (K : Nkind) return Boolean is + begin + case K is + when N_Log_Imp_Prop + | N_Until + | N_Before + | N_Or_Prop + | N_And_Prop + | N_Concat_SERE + | N_Fusion_SERE + | N_Within_SERE + | N_Match_And_Seq + | N_And_Seq + | N_Or_Seq + | N_And_Bool + | N_Or_Bool + | N_Imp_Bool => + return True; + when others => + return False; + end case; + end Has_Left; + + function Has_Right (K : Nkind) return Boolean is + begin + case K is + when N_Log_Imp_Prop + | N_Until + | N_Before + | N_Or_Prop + | N_And_Prop + | N_Concat_SERE + | N_Fusion_SERE + | N_Within_SERE + | N_Match_And_Seq + | N_And_Seq + | N_Or_Seq + | N_And_Bool + | N_Or_Bool + | N_Imp_Bool => + return True; + when others => + return False; + end case; + end Has_Right; + + function Has_Sequence (K : Nkind) return Boolean is + begin + case K is + when N_Sequence_Declaration + | N_Endpoint_Declaration + | N_Imp_Seq + | N_Overlap_Imp_Seq + | N_Star_Repeat_Seq + | N_Goto_Repeat_Seq + | N_Plus_Repeat_Seq + | N_Equal_Repeat_Seq => + return True; + when others => + return False; + end case; + end Has_Sequence; + + function Has_Strong_Flag (K : Nkind) return Boolean is + begin + case K is + when N_Next + | N_Next_A + | N_Next_E + | N_Next_Event + | N_Next_Event_A + | N_Next_Event_E + | N_Until + | N_Before => + return True; + when others => + return False; + end case; + end Has_Strong_Flag; + + function Has_Inclusive_Flag (K : Nkind) return Boolean is + begin + case K is + when N_Until + | N_Before => + return True; + when others => + return False; + end case; + end Has_Inclusive_Flag; + + function Has_Low_Bound (K : Nkind) return Boolean is + begin + case K is + when N_Next_A + | N_Next_E + | N_Next_Event_A + | N_Next_Event_E + | N_Star_Repeat_Seq + | N_Goto_Repeat_Seq + | N_Equal_Repeat_Seq => + return True; + when others => + return False; + end case; + end Has_Low_Bound; + + function Has_High_Bound (K : Nkind) return Boolean is + begin + case K is + when N_Next_A + | N_Next_E + | N_Next_Event_A + | N_Next_Event_E + | N_Star_Repeat_Seq + | N_Goto_Repeat_Seq + | N_Equal_Repeat_Seq => + return True; + when others => + return False; + end case; + end Has_High_Bound; + + function Has_Number (K : Nkind) return Boolean is + begin + case K is + when N_Next + | N_Next_Event => + return True; + when others => + return False; + end case; + end Has_Number; + + function Has_Value (K : Nkind) return Boolean is + begin + return K = N_Number; + end Has_Value; + + function Has_Boolean (K : Nkind) return Boolean is + begin + case K is + when N_Clock_Event + | N_Next_Event + | N_Next_Event_A + | N_Next_Event_E + | N_Abort + | N_Not_Bool => + return True; + when others => + return False; + end case; + end Has_Boolean; + + function Has_Decl (K : Nkind) return Boolean is + begin + return K = N_Name; + end Has_Decl; + + function Has_HDL_Node (K : Nkind) return Boolean is + begin + return K = N_HDL_Expr; + end Has_HDL_Node; + + function Has_Hash (K : Nkind) return Boolean is + begin + case K is + when N_Not_Bool + | N_And_Bool + | N_Or_Bool + | N_Imp_Bool + | N_HDL_Expr + | N_EOS => + return True; + when others => + return False; + end case; + end Has_Hash; + + function Has_Hash_Link (K : Nkind) return Boolean is + begin + case K is + when N_Not_Bool + | N_And_Bool + | N_Or_Bool + | N_Imp_Bool + | N_HDL_Expr + | N_EOS => + return True; + when others => + return False; + end case; + end Has_Hash_Link; + + function Has_HDL_Index (K : Nkind) return Boolean is + begin + case K is + when N_HDL_Expr + | N_EOS => + return True; + when others => + return False; + end case; + end Has_HDL_Index; + + function Has_Presence (K : Nkind) return Boolean is + begin + case K is + when N_Not_Bool + | N_And_Bool + | N_Or_Bool + | N_Imp_Bool + | N_HDL_Expr => + return True; + when others => + return False; + end case; + end Has_Presence; + + function Has_NFA (K : Nkind) return Boolean is + begin + return K = N_Assert_Directive; + end Has_NFA; + + function Has_Parameter_List (K : Nkind) return Boolean is + begin + case K is + when N_Property_Declaration + | N_Sequence_Declaration + | N_Endpoint_Declaration => + return True; + when others => + return False; + end case; + end Has_Parameter_List; + + function Has_Actual (K : Nkind) return Boolean is + begin + case K is + when N_Const_Parameter + | N_Boolean_Parameter + | N_Property_Parameter + | N_Sequence_Parameter + | N_Actual => + return True; + when others => + return False; + end case; + end Has_Actual; + + function Has_Formal (K : Nkind) return Boolean is + begin + return K = N_Actual; + end Has_Formal; + + function Has_Declaration (K : Nkind) return Boolean is + begin + case K is + when N_Sequence_Instance + | N_Endpoint_Instance + | N_Property_Instance => + return True; + when others => + return False; + end case; + end Has_Declaration; + + function Has_Association_Chain (K : Nkind) return Boolean is + begin + case K is + when N_Sequence_Instance + | N_Endpoint_Instance + | N_Property_Instance => + return True; + when others => + return False; + end case; + end Has_Association_Chain; + + function Has_Global_Clock (K : Nkind) return Boolean is + begin + return K = N_Property_Declaration; + end Has_Global_Clock; + +end PSL.Nodes_Meta; diff --git a/src/psl/psl-nodes_meta.adb.in b/src/psl/psl-nodes_meta.adb.in new file mode 100644 index 000000000..efabbaf55 --- /dev/null +++ b/src/psl/psl-nodes_meta.adb.in @@ -0,0 +1,76 @@ +-- Meta description of nodes. +-- Copyright (C) 2015 Tristan Gingold +-- +-- GHDL is free software; you can redistribute it and/or modify it under +-- the terms of the GNU General Public License as published by the Free +-- Software Foundation; either version 2, or (at your option) any later +-- version. +-- +-- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY +-- WARRANTY; without even the implied warranty of MERCHANTABILITY or +-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-- for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with GHDL; see the file COPYING. If not, write to the Free +-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA +-- 02111-1307, USA. + +package body PSL.Nodes_Meta is + Fields_Type : constant array (Fields_Enum) of Types_Enum := + ( + -- FIELDS_TYPE + ); + + function Get_Field_Type (F : Fields_Enum) return Types_Enum is + begin + return Fields_Type (F); + end Get_Field_Type; + + function Get_Field_Image (F : Fields_Enum) return String is + begin + case F is + -- FIELD_IMAGE + end case; + end Get_Field_Image; + + function Get_Nkind_Image (K : Nkind) return String is + begin + case K is + -- IIR_IMAGE + end case; + end Get_Nkind_Image; + + function Get_Field_Attribute (F : Fields_Enum) return Field_Attribute is + begin + case F is + -- FIELD_ATTRIBUTE + end case; + end Get_Field_Attribute; + + Fields_Of_Nodes : constant Fields_Array := + ( + -- FIELDS_ARRAY + ); + + Fields_Of_Nodes_Last : constant array (Nkind) of Integer := + ( + -- FIELDS_ARRAY_POS + ); + + function Get_Fields (K : Nkind) return Fields_Array + is + First : Natural; + Last : Integer; + begin + if K = Nkind'First then + First := Fields_Of_Nodes'First; + else + First := Fields_Of_Nodes_Last (Nkind'Pred (K)) + 1; + end if; + Last := Fields_Of_Nodes_Last (K); + return Fields_Of_Nodes (First .. Last); + end Get_Fields; + + -- FUNCS_BODY +end PSL.Nodes_Meta; diff --git a/src/psl/psl-nodes_meta.ads b/src/psl/psl-nodes_meta.ads new file mode 100644 index 000000000..e8df654b6 --- /dev/null +++ b/src/psl/psl-nodes_meta.ads @@ -0,0 +1,174 @@ +-- Meta description of nodes. +-- Copyright (C) 2015 Tristan Gingold +-- +-- GHDL is free software; you can redistribute it and/or modify it under +-- the terms of the GNU General Public License as published by the Free +-- Software Foundation; either version 2, or (at your option) any later +-- version. +-- +-- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY +-- WARRANTY; without even the implied warranty of MERCHANTABILITY or +-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-- for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with GHDL; see the file COPYING. If not, write to the Free +-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA +-- 02111-1307, USA. + +with Types; use Types; +with PSL.Nodes; use PSL.Nodes; + +package PSL.Nodes_Meta is + -- The enumeration of all possible types in the nodes. + type Types_Enum is + ( + Type_Boolean, + Type_HDL_Node, + Type_Int32, + Type_NFA, + Type_Name_Id, + Type_Node, + Type_PSL_Presence_Kind, + Type_Uns32 + ); + + -- The enumeration of all fields defined in iirs. + type Fields_Enum is + ( + Field_Identifier, + Field_Label, + Field_Chain, + Field_Instance, + Field_Prefix, + Field_Item_Chain, + Field_Property, + Field_String, + Field_SERE, + Field_Left, + Field_Right, + Field_Sequence, + Field_Strong_Flag, + Field_Inclusive_Flag, + Field_Low_Bound, + Field_High_Bound, + Field_Number, + Field_Value, + Field_Boolean, + Field_Decl, + Field_HDL_Node, + Field_Hash, + Field_Hash_Link, + Field_HDL_Index, + Field_Presence, + Field_NFA, + Field_Parameter_List, + Field_Actual, + Field_Formal, + Field_Declaration, + Field_Association_Chain, + Field_Global_Clock + ); + pragma Discard_Names (Fields_Enum); + + -- Return the type of field F. + function Get_Field_Type (F : Fields_Enum) return Types_Enum; + + -- Get the name of a field. + function Get_Field_Image (F : Fields_Enum) return String; + + -- Get the name of a kind. + function Get_Nkind_Image (K : Nkind) return String; + + -- Possible attributes of a field. + type Field_Attribute is + ( + Attr_None, + Attr_Ref, Attr_Maybe_Ref, Attr_Of_Ref, + Attr_Chain, Attr_Chain_Next + ); + + -- Get the attribute of a field. + function Get_Field_Attribute (F : Fields_Enum) return Field_Attribute; + + type Fields_Array is array (Natural range <>) of Fields_Enum; + + -- Return the list of fields for node K. The fields are sorted: first + -- the non nodes/list of nodes, then the nodes/lists that aren't reference, + -- and then the reference. + function Get_Fields (K : Nkind) return Fields_Array; + + -- Get/Set a field. + function Get_Boolean + (N : Node; F : Fields_Enum) return Boolean; + procedure Set_Boolean + (N : Node; F : Fields_Enum; V: Boolean); + + function Get_HDL_Node + (N : Node; F : Fields_Enum) return HDL_Node; + procedure Set_HDL_Node + (N : Node; F : Fields_Enum; V: HDL_Node); + + function Get_Int32 + (N : Node; F : Fields_Enum) return Int32; + procedure Set_Int32 + (N : Node; F : Fields_Enum; V: Int32); + + function Get_NFA + (N : Node; F : Fields_Enum) return NFA; + procedure Set_NFA + (N : Node; F : Fields_Enum; V: NFA); + + function Get_Name_Id + (N : Node; F : Fields_Enum) return Name_Id; + procedure Set_Name_Id + (N : Node; F : Fields_Enum; V: Name_Id); + + function Get_Node + (N : Node; F : Fields_Enum) return Node; + procedure Set_Node + (N : Node; F : Fields_Enum; V: Node); + + function Get_PSL_Presence_Kind + (N : Node; F : Fields_Enum) return PSL_Presence_Kind; + procedure Set_PSL_Presence_Kind + (N : Node; F : Fields_Enum; V: PSL_Presence_Kind); + + function Get_Uns32 + (N : Node; F : Fields_Enum) return Uns32; + procedure Set_Uns32 + (N : Node; F : Fields_Enum; V: Uns32); + + function Has_Identifier (K : Nkind) return Boolean; + function Has_Label (K : Nkind) return Boolean; + function Has_Chain (K : Nkind) return Boolean; + function Has_Instance (K : Nkind) return Boolean; + function Has_Prefix (K : Nkind) return Boolean; + function Has_Item_Chain (K : Nkind) return Boolean; + function Has_Property (K : Nkind) return Boolean; + function Has_String (K : Nkind) return Boolean; + function Has_SERE (K : Nkind) return Boolean; + function Has_Left (K : Nkind) return Boolean; + function Has_Right (K : Nkind) return Boolean; + function Has_Sequence (K : Nkind) return Boolean; + function Has_Strong_Flag (K : Nkind) return Boolean; + function Has_Inclusive_Flag (K : Nkind) return Boolean; + function Has_Low_Bound (K : Nkind) return Boolean; + function Has_High_Bound (K : Nkind) return Boolean; + function Has_Number (K : Nkind) return Boolean; + function Has_Value (K : Nkind) return Boolean; + function Has_Boolean (K : Nkind) return Boolean; + function Has_Decl (K : Nkind) return Boolean; + function Has_HDL_Node (K : Nkind) return Boolean; + function Has_Hash (K : Nkind) return Boolean; + function Has_Hash_Link (K : Nkind) return Boolean; + function Has_HDL_Index (K : Nkind) return Boolean; + function Has_Presence (K : Nkind) return Boolean; + function Has_NFA (K : Nkind) return Boolean; + function Has_Parameter_List (K : Nkind) return Boolean; + function Has_Actual (K : Nkind) return Boolean; + function Has_Formal (K : Nkind) return Boolean; + function Has_Declaration (K : Nkind) return Boolean; + function Has_Association_Chain (K : Nkind) return Boolean; + function Has_Global_Clock (K : Nkind) return Boolean; +end PSL.Nodes_Meta; diff --git a/src/psl/psl-nodes_meta.ads.in b/src/psl/psl-nodes_meta.ads.in new file mode 100644 index 000000000..aff379f9d --- /dev/null +++ b/src/psl/psl-nodes_meta.ads.in @@ -0,0 +1,65 @@ +-- Meta description of nodes. +-- Copyright (C) 2015 Tristan Gingold +-- +-- GHDL is free software; you can redistribute it and/or modify it under +-- the terms of the GNU General Public License as published by the Free +-- Software Foundation; either version 2, or (at your option) any later +-- version. +-- +-- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY +-- WARRANTY; without even the implied warranty of MERCHANTABILITY or +-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-- for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with GHDL; see the file COPYING. If not, write to the Free +-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA +-- 02111-1307, USA. + +with Types; use Types; +with PSL.Nodes; use PSL.Nodes; + +package PSL.Nodes_Meta is + -- The enumeration of all possible types in the nodes. + type Types_Enum is + ( + -- TYPES + ); + + -- The enumeration of all fields defined in iirs. + type Fields_Enum is + ( + -- FIELDS + ); + pragma Discard_Names (Fields_Enum); + + -- Return the type of field F. + function Get_Field_Type (F : Fields_Enum) return Types_Enum; + + -- Get the name of a field. + function Get_Field_Image (F : Fields_Enum) return String; + + -- Get the name of a kind. + function Get_Nkind_Image (K : Nkind) return String; + + -- Possible attributes of a field. + type Field_Attribute is + ( + Attr_None, + Attr_Ref, Attr_Maybe_Ref, Attr_Of_Ref, + Attr_Chain, Attr_Chain_Next + ); + + -- Get the attribute of a field. + function Get_Field_Attribute (F : Fields_Enum) return Field_Attribute; + + type Fields_Array is array (Natural range <>) of Fields_Enum; + + -- Return the list of fields for node K. The fields are sorted: first + -- the non nodes/list of nodes, then the nodes/lists that aren't reference, + -- and then the reference. + function Get_Fields (K : Nkind) return Fields_Array; + + -- Get/Set a field. + -- FUNCS +end PSL.Nodes_Meta; |