aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl/vhdl-configuration.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/vhdl/vhdl-configuration.adb')
-rw-r--r--src/vhdl/vhdl-configuration.adb155
1 files changed, 100 insertions, 55 deletions
diff --git a/src/vhdl/vhdl-configuration.adb b/src/vhdl/vhdl-configuration.adb
index e84e3f7f0..395888d69 100644
--- a/src/vhdl/vhdl-configuration.adb
+++ b/src/vhdl/vhdl-configuration.adb
@@ -114,7 +114,9 @@ package body Vhdl.Configuration is
while Is_Valid (It) loop
El := Get_Element (It);
El := Libraries.Find_Design_Unit (El);
- if El /= Null_Iir then
+ if El /= Null_Iir
+ and then Get_Kind (El) = Iir_Kind_Design_Unit
+ then
Lib_Unit := Get_Library_Unit (El);
if Flag_Build_File_Dependence then
Add_Design_Unit (El, Loc);
@@ -305,6 +307,9 @@ package body Vhdl.Configuration is
-- In case of error (using -c).
return;
end if;
+ if Get_Kind (Entity_Lib) = Iir_Kind_Foreign_Module then
+ return;
+ end if;
Entity := Get_Design_Unit (Entity_Lib);
Add_Design_Unit (Entity, Loc);
@@ -425,7 +430,7 @@ package body Vhdl.Configuration is
Aspect : constant Iir := Get_Entity_Aspect (Bind);
Ent : constant Iir := Get_Entity_From_Entity_Aspect (Aspect);
Assoc_Chain : constant Iir := Get_Port_Map_Aspect_Chain (Bind);
- Inter_Chain : constant Iir := Get_Port_Chain (Ent);
+ Inter_Chain : Iir;
Assoc : Iir;
Inter : Iir;
Inst_Assoc_Chain : Iir;
@@ -438,6 +443,11 @@ package body Vhdl.Configuration is
Inter_1 : Iir;
Actual : Iir;
begin
+ if Get_Kind (Ent) = Iir_Kind_Foreign_Module then
+ return;
+ end if;
+
+ Inter_Chain := Get_Port_Chain (Ent);
Err := False;
-- Note: the assoc chain is already canonicalized.
@@ -643,6 +653,10 @@ package body Vhdl.Configuration is
& Name_Table.Image (Primary_Id));
return Null_Iir;
end if;
+ if Get_Kind (Unit) = Iir_Kind_Foreign_Module then
+ return Unit;
+ end if;
+
Lib_Unit := Get_Library_Unit (Unit);
case Get_Kind (Lib_Unit) is
when Iir_Kind_Entity_Declaration =>
@@ -747,12 +761,14 @@ package body Vhdl.Configuration is
while File /= Null_Iir loop
Unit := Get_First_Design_Unit (File);
while Unit /= Null_Iir loop
- Lib := Get_Library_Unit (Unit);
- if Get_Kind (Lib) = Iir_Kind_Vunit_Declaration then
- -- Load it.
- Load_Design_Unit (Unit, Unit);
+ if Get_Kind (Unit) = Iir_Kind_Design_Unit then
+ Lib := Get_Library_Unit (Unit);
+ if Get_Kind (Lib) = Iir_Kind_Vunit_Declaration then
+ -- Load it.
+ Load_Design_Unit (Unit, Unit);
- Add_Verification_Unit (Get_Library_Unit (Unit));
+ Add_Verification_Unit (Get_Library_Unit (Unit));
+ end if;
end if;
Unit := Get_Chain (Unit);
end loop;
@@ -873,7 +889,7 @@ package body Vhdl.Configuration is
-- Add entities to the name table (so that they easily could be found).
function Add_Entity_Cb (Design : Iir) return Walk_Status
is
- Kind : constant Iir_Kind := Get_Kind (Get_Library_Unit (Design));
+ Lib_Unit : Iir;
begin
if not Flags.Flag_Elaborate_With_Outdated then
-- Discard obsolete or non-analyzed units.
@@ -882,20 +898,29 @@ package body Vhdl.Configuration is
end if;
end if;
- case Iir_Kinds_Library_Unit (Kind) is
- when Iir_Kind_Architecture_Body
- | Iir_Kind_Configuration_Declaration =>
- Load_Design_Unit (Design, Loc_Err);
- when Iir_Kind_Entity_Declaration =>
- Load_Design_Unit (Design, Loc_Err);
- Vhdl.Sem_Scopes.Add_Name (Get_Library_Unit (Design));
- when Iir_Kind_Package_Declaration
- | Iir_Kind_Package_Instantiation_Declaration
- | Iir_Kind_Package_Body
- | Iir_Kinds_Verification_Unit
- | Iir_Kind_Context_Declaration =>
- null;
+ case Iir_Kinds_Design_Unit (Get_Kind (Design)) is
+ when Iir_Kind_Design_Unit =>
+ Lib_Unit := Get_Library_Unit (Design);
+ case Iir_Kinds_Library_Unit (Get_Kind (Lib_Unit)) is
+ when Iir_Kind_Architecture_Body
+ | Iir_Kind_Configuration_Declaration =>
+ Load_Design_Unit (Design, Loc_Err);
+ when Iir_Kind_Entity_Declaration =>
+ Load_Design_Unit (Design, Loc_Err);
+ -- Library unit has changed (loaded).
+ Lib_Unit := Get_Library_Unit (Design);
+ Vhdl.Sem_Scopes.Add_Name (Lib_Unit);
+ when Iir_Kind_Package_Declaration
+ | Iir_Kind_Package_Instantiation_Declaration
+ | Iir_Kind_Package_Body
+ | Iir_Kinds_Verification_Unit
+ | Iir_Kind_Context_Declaration =>
+ null;
+ end case;
+ when Iir_Kind_Foreign_Module =>
+ Vhdl.Sem_Scopes.Add_Name (Design);
end case;
+
return Walk_Continue;
end Add_Entity_Cb;
@@ -951,9 +976,14 @@ package body Vhdl.Configuration is
Interp := Get_Interpretation (Get_Identifier (Comp));
if Valid_Interpretation (Interp) then
Decl := Get_Declaration (Interp);
- pragma Assert
- (Get_Kind (Decl) = Iir_Kind_Entity_Declaration);
- Set_Elab_Flag (Get_Design_Unit (Decl), True);
+ case Get_Kind (Decl) is
+ when Iir_Kind_Entity_Declaration =>
+ Set_Elab_Flag (Get_Design_Unit (Decl), True);
+ when Iir_Kind_Foreign_Module =>
+ Set_Elab_Flag (Decl, True);
+ when others =>
+ raise Internal_Error;
+ end case;
else
-- If there is no corresponding entity name for the
-- component name, assume it belongs to a different
@@ -972,7 +1002,7 @@ package body Vhdl.Configuration is
function Mark_Units_Cb (Design : Iir) return Walk_Status
is
- Unit : constant Iir := Get_Library_Unit (Design);
+ Unit : Iir;
Status : Walk_Status;
begin
if not Flags.Flag_Elaborate_With_Outdated then
@@ -982,23 +1012,29 @@ package body Vhdl.Configuration is
end if;
end if;
- case Iir_Kinds_Library_Unit (Get_Kind (Unit)) is
- when Iir_Kind_Architecture_Body =>
- Status := Walk_Concurrent_Statements_Chain
- (Get_Concurrent_Statement_Chain (Unit),
- Mark_Instantiation_Cb'Access);
- pragma Assert (Status = Walk_Continue);
- when Iir_Kind_Configuration_Declaration =>
- -- Just ignored.
- null;
- when Iir_Kind_Package_Declaration
- | Iir_Kind_Package_Instantiation_Declaration
- | Iir_Kind_Package_Body
- | Iir_Kind_Entity_Declaration
- | Iir_Kinds_Verification_Unit
- | Iir_Kind_Context_Declaration =>
- null;
- end case;
+ if Get_Kind (Design) = Iir_Kind_Design_Unit then
+ Unit := Get_Library_Unit (Design);
+ case Iir_Kinds_Library_Unit (Get_Kind (Unit)) is
+ when Iir_Kind_Architecture_Body =>
+ Status := Walk_Concurrent_Statements_Chain
+ (Get_Concurrent_Statement_Chain (Unit),
+ Mark_Instantiation_Cb'Access);
+ pragma Assert (Status = Walk_Continue);
+ when Iir_Kind_Configuration_Declaration =>
+ -- Just ignored.
+ null;
+ when Iir_Kind_Package_Declaration
+ | Iir_Kind_Package_Instantiation_Declaration
+ | Iir_Kind_Package_Body
+ | Iir_Kind_Entity_Declaration
+ | Iir_Kinds_Verification_Unit
+ | Iir_Kind_Context_Declaration =>
+ null;
+ end case;
+ else
+ -- TODO: also traverse foreign units
+ null;
+ end if;
return Walk_Continue;
end Mark_Units_Cb;
@@ -1029,21 +1065,30 @@ package body Vhdl.Configuration is
function Extract_Entity_Cb (Design : Iir) return Walk_Status
is
- Unit : constant Iir := Get_Library_Unit (Design);
+ Unit : Iir;
begin
- if Get_Kind (Unit) = Iir_Kind_Entity_Declaration then
- if Get_Elab_Flag (Design) then
- -- Clean elab flag.
- Set_Elab_Flag (Design, False);
- else
- if Flags.Verbose then
- Report_Msg (Msgid_Note, Elaboration, +Unit,
- "candidate for top entity: %n", (1 => +Unit));
- end if;
- Nbr_Top_Entities := Nbr_Top_Entities + 1;
- if Nbr_Top_Entities = 1 then
- First_Top_Entity := Unit;
+ case Iir_Kinds_Design_Unit (Get_Kind (Design)) is
+ when Iir_Kind_Foreign_Module =>
+ Unit := Design;
+ when Iir_Kind_Design_Unit =>
+ Unit := Get_Library_Unit (Design);
+
+ if Get_Kind (Unit) /= Iir_Kind_Entity_Declaration then
+ return Walk_Continue;
end if;
+ end case;
+
+ if Get_Elab_Flag (Design) then
+ -- Clean elab flag.
+ Set_Elab_Flag (Design, False);
+ else
+ if Flags.Verbose then
+ Report_Msg (Msgid_Note, Elaboration, +Unit,
+ "candidate for top entity: %n", (1 => +Unit));
+ end if;
+ Nbr_Top_Entities := Nbr_Top_Entities + 1;
+ if Nbr_Top_Entities = 1 then
+ First_Top_Entity := Unit;
end if;
end if;
return Walk_Continue;