Skip to content

Commit

Permalink
Added warnings on duplicate design units. Issue #75.
Browse files Browse the repository at this point in the history
  • Loading branch information
kraigher committed Sep 18, 2015
1 parent 95d61ba commit 8322f0e
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 13 deletions.
57 changes: 44 additions & 13 deletions vunit/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -402,28 +402,59 @@ def is_external(self):
"""
return self._is_external

@staticmethod
def _warn_duplication(design_unit, old_file_name):
"""
Utility function to give warning for design unit duplication
"""
LOGGER.warning("%s: %s '%s' previously defined in %s",
design_unit.source_file.name,
design_unit.unit_type,
design_unit.name,
old_file_name)

def _check_duplication(self, dictionary, design_unit):
"""
Utility function to check if design_unit already in dictionary
and give warning
"""
if design_unit.name in dictionary:
self._warn_duplication(design_unit, dictionary[design_unit.name].source_file.name)

def add_vhdl_design_units(self, design_units):
"""
Add VHDL design units to the library
"""
for design_unit in design_units:
if design_unit.is_primary:
self._check_duplication(self.primary_design_units,
design_unit)
self.primary_design_units[design_unit.name] = design_unit

if design_unit.unit_type == 'entity':
if design_unit.name not in self._architecture_names:
self._architecture_names[design_unit.name] = {}
self._entities[design_unit.name] = design_unit

if design_unit.unit_type == 'architecture':
if design_unit.primary_design_unit not in self._architecture_names:
self._architecture_names[design_unit.primary_design_unit] = {}
if design_unit.unit_type == 'entity':
if design_unit.name not in self._architecture_names:
self._architecture_names[design_unit.name] = {}
self._entities[design_unit.name] = design_unit

file_name = design_unit.source_file.name
self._architecture_names[design_unit.primary_design_unit][design_unit.name] = file_name

if design_unit.unit_type == 'package body':
self._package_bodies[design_unit.primary_design_unit] = design_unit
else:
if design_unit.unit_type == 'architecture':
if design_unit.primary_design_unit not in self._architecture_names:
self._architecture_names[design_unit.primary_design_unit] = {}

if design_unit.name in self._architecture_names[design_unit.primary_design_unit]:
self._warn_duplication(
design_unit,
self._architecture_names[design_unit.primary_design_unit][design_unit.name])

file_name = design_unit.source_file.name
self._architecture_names[design_unit.primary_design_unit][design_unit.name] = file_name

if design_unit.unit_type == 'package body':
if design_unit.primary_design_unit in self._package_bodies:
self._warn_duplication(
design_unit,
self._package_bodies[design_unit.primary_design_unit].source_file.name)
self._package_bodies[design_unit.primary_design_unit] = design_unit

def add_verilog_design_units(self, design_units):
"""
Expand Down
96 changes: 96 additions & 0 deletions vunit/test/unit/test_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,102 @@ def test_warning_on_missing_specific_architecture_reference(self, mock_logger):
self.assertIn("a2", log_msg)
self.assertIn("lib.ent", log_msg)

def _test_warning_on_duplicate(self, mock_logger, code, message):
"""
Utility function to test adding the same duplicate code under
file.vhd and file_copy.vhd where the duplication should cause a warning message.
"""
self.add_source_file("lib", "file.vhd", code)

warning_calls = mock_logger.warning.call_args_list

self.assertEqual(len(warning_calls), 0)

self.add_source_file("lib", "file_copy.vhd", code)

warning_calls = mock_logger.warning.call_args_list
self.assertEqual(len(warning_calls), 1)

log_msg = warning_calls[0][0][0] % warning_calls[0][0][1:]
self.assertEqual(log_msg, message)

@mock.patch("vunit.project.LOGGER")
def test_warning_on_duplicate_entity(self, mock_logger):
self.project.add_library("lib", "lib_path")
self._test_warning_on_duplicate(
mock_logger, """
entity ent is
end entity;
""",
"file_copy.vhd: entity 'ent' previously defined in file.vhd")

@mock.patch("vunit.project.LOGGER")
def test_warning_on_duplicate_package(self, mock_logger):
self.project.add_library("lib", "lib_path")
self._test_warning_on_duplicate(
mock_logger, """
package pkg is
end package;
""",
"file_copy.vhd: package 'pkg' previously defined in file.vhd")

@mock.patch("vunit.project.LOGGER")
def test_warning_on_duplicate_configuration(self, mock_logger):
self.project.add_library("lib", "lib_path")
self._test_warning_on_duplicate(
mock_logger, """
configuration cfg of ent is
end configuration;
""",
"file_copy.vhd: configuration 'cfg' previously defined in file.vhd")

@mock.patch("vunit.project.LOGGER")
def test_warning_on_duplicate_package_body(self, mock_logger):
self.project.add_library("lib", "lib_path")
self.add_source_file("lib", "pkg.vhd", """
package pkg is
end package;
""")

self._test_warning_on_duplicate(
mock_logger, """
package body pkg is
end package bodY;
""",
"file_copy.vhd: package body 'pkg' previously defined in file.vhd")

@mock.patch("vunit.project.LOGGER")
def test_warning_on_duplicate_architecture(self, mock_logger):
self.project.add_library("lib", "lib_path")
self.add_source_file("lib", "ent.vhd", """
entity ent is
end entity;
""")

self.add_source_file("lib", "arch.vhd", """
architecture a_no_duplicate of ent is
begin
end architecture;
""")

self._test_warning_on_duplicate(
mock_logger, """
architecture a of ent is
begin
end architecture;
""",
"file_copy.vhd: architecture 'a' previously defined in file.vhd")

@mock.patch("vunit.project.LOGGER")
def test_warning_on_duplicate_context(self, mock_logger):
self.project.add_library("lib", "lib_path")
self._test_warning_on_duplicate(
mock_logger, """
context ctx is
end context;
""",
"file_copy.vhd: context 'ctx' previously defined in file.vhd")

def test_should_recompile_all_files_initially(self):
self.create_dummy_three_file_project()
self.assert_should_recompile(["file1.vhd", "file2.vhd", "file3.vhd"])
Expand Down

0 comments on commit 8322f0e

Please sign in to comment.