Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1# -------------------------------------------------------------------------------------------------- 

2# Copyright (c) Lukas Vik. All rights reserved. 

3# 

4# This file is part of the tsfpga project. 

5# https://tsfpga.com 

6# https://gitlab.com/tsfpga/tsfpga 

7# -------------------------------------------------------------------------------------------------- 

8 

9from pathlib import Path 

10from unittest import TestCase 

11from unittest.mock import MagicMock, patch 

12 

13import pytest 

14 

15from tsfpga.vivado.simlib import VivadoSimlib 

16 

17# pylint: disable=unused-import 

18from tsfpga.test.conftest import fixture_tmp_path # noqa: F401 

19 

20 

21@pytest.mark.usefixtures("fixture_tmp_path") 

22class TestVivadoSimlibCommercial(TestCase): 

23 

24 tmp_path = None 

25 

26 def setUp(self): 

27 self.output_path = self.tmp_path / "simlib" 

28 

29 self.simulator_prefix = "/opt/Aldec/Riviera-PRO-2018.10-x64/bin" 

30 self.vivado_path = Path("/tools/xilinx/Vivado/2019.2/bin/vivado") 

31 

32 self.vivado_simlib = self.get_vivado_simlib(self.simulator_prefix, self.vivado_path) 

33 

34 def get_vivado_simlib(self, simulator_prefix, vivado_path): 

35 simulator_class = MagicMock() 

36 simulator_class.name = "rivierapro" 

37 simulator_class.find_prefix.return_value = simulator_prefix 

38 

39 vunit_proj = MagicMock() 

40 vunit_proj._simulator_class = simulator_class # pylint: disable=protected-access 

41 

42 return VivadoSimlib.init(self.output_path, vunit_proj, vivado_path) 

43 

44 def test_should_not_recompile(self): 

45 self.assert_should_compile(self.vivado_simlib) 

46 self.assert_should_not_compile(self.vivado_simlib) 

47 

48 def test_new_simulator_version_should_cause_recompile(self): 

49 self.assert_should_compile(self.vivado_simlib) 

50 self.assert_should_not_compile(self.vivado_simlib) 

51 

52 vivado_simlib = self.get_vivado_simlib( 

53 "/opt/Aldec/Riviera-PRO-1975.01-x64/bin", self.vivado_path 

54 ) 

55 self.assert_should_compile(vivado_simlib) 

56 self.assert_should_not_compile(vivado_simlib) 

57 

58 def test_new_vivado_version_should_cause_recompile(self): 

59 self.assert_should_compile(self.vivado_simlib) 

60 self.assert_should_not_compile(self.vivado_simlib) 

61 

62 vivado_simlib = self.get_vivado_simlib( 

63 self.simulator_prefix, Path("/tools/xilinx/Vivado/1337.2/bin/vivado") 

64 ) 

65 self.assert_should_compile(vivado_simlib) 

66 self.assert_should_not_compile(vivado_simlib) 

67 

68 @staticmethod 

69 def assert_should_compile(vivado_simlib): 

70 assert vivado_simlib.compile_is_needed 

71 with patch("tsfpga.vivado.simlib_commercial.run_vivado_tcl", autospec=True) as mock: 

72 vivado_simlib.compile_if_needed() 

73 mock.assert_called_once() 

74 

75 @staticmethod 

76 def assert_should_not_compile(vivado_simlib): 

77 assert not vivado_simlib.compile_is_needed 

78 with patch("tsfpga.vivado.simlib_commercial.run_vivado_tcl", autospec=True) as mock: 

79 vivado_simlib.compile_if_needed() 

80 mock.assert_not_called() 

81 

82 

83@pytest.mark.usefixtures("fixture_tmp_path") 

84class TestVivadoSimlibGhdl(TestCase): 

85 

86 """ 

87 Test a subset of what is tested for commercial, since most of the code is inherited 

88 from the common class. 

89 """ 

90 

91 tmp_path = None 

92 

93 def setUp(self): 

94 self.output_path = self.tmp_path / "simlib" 

95 

96 self.vivado_simlib = self.get_vivado_simlib() 

97 

98 def get_vivado_simlib(self, ghdl_version_string="GHDL 0.36 ..."): 

99 with patch("tsfpga.vivado.simlib_ghdl.subprocess.check_output") as check_output: 

100 check_output.return_value = ghdl_version_string.encode("UTF-8") 

101 

102 simulator_class = MagicMock() 

103 simulator_class.name = "ghdl" 

104 simulator_class.find_prefix.return_value = "/usr/bin" 

105 

106 vunit_proj = MagicMock() 

107 vunit_proj._simulator_class = simulator_class # pylint: disable=protected-access 

108 

109 vivado_simlib = VivadoSimlib.init( 

110 self.output_path, vunit_proj, Path("/tools/xilinx/Vivado/2019.2/bin/vivado") 

111 ) 

112 

113 return vivado_simlib 

114 

115 def test_should_not_recompile(self): 

116 self.assert_should_compile(self.vivado_simlib) 

117 self.assert_should_not_compile(self.vivado_simlib) 

118 

119 def test_ghdl_version_string(self): 

120 assert self.get_vivado_simlib( 

121 ghdl_version_string="GHDL 0.36 (v0.36) [Dunoon edition]" 

122 ).artifact_name.endswith(".ghdl_0_36_v0_36") 

123 assert self.get_vivado_simlib( 

124 ghdl_version_string="GHDL 0.36 [Dunoon edition]" 

125 ).artifact_name.endswith(".ghdl_0_36") 

126 assert self.get_vivado_simlib( 

127 ghdl_version_string="GHDL 0.36 (v0.36)" 

128 ).artifact_name.endswith(".ghdl_0_36_v0_36") 

129 assert self.get_vivado_simlib(ghdl_version_string="GHDL 0.36").artifact_name.endswith( 

130 ".ghdl_0_36" 

131 ) 

132 

133 assert self.get_vivado_simlib( 

134 ghdl_version_string="GHDL 0.37-dev (v0.36-1605-ge4aa89cd) [Dunoon edition]" 

135 ).artifact_name.endswith(".ghdl_0_37_dev_v0_36_1605_ge4aa89cd") 

136 assert self.get_vivado_simlib( 

137 ghdl_version_string="GHDL 0.37-dev (v0.36-1605-ge4aa89cd)" 

138 ).artifact_name.endswith(".ghdl_0_37_dev_v0_36_1605_ge4aa89cd") 

139 

140 @staticmethod 

141 def assert_should_compile(vivado_simlib): 

142 assert vivado_simlib.compile_is_needed 

143 with patch("tsfpga.vivado.simlib_ghdl.VivadoSimlibGhdl._compile", autospec=True) as mock: 

144 vivado_simlib.compile_if_needed() 

145 mock.assert_called_once() 

146 

147 @staticmethod 

148 def assert_should_not_compile(vivado_simlib): 

149 assert not vivado_simlib.compile_is_needed 

150 with patch("tsfpga.vivado.simlib_ghdl.VivadoSimlibGhdl._compile", autospec=True) as mock: 

151 vivado_simlib.compile_if_needed() 

152 mock.assert_not_called()