Coverage for tsfpga/vivado/test/test_simlib.py: 100%

86 statements  

« prev     ^ index     » next       coverage.py v6.4, created at 2022-05-28 04:01 +0000

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 ( 

121 ".ghdl_0_36_v0_36." 

122 in self.get_vivado_simlib( 

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

124 ).artifact_name 

125 ) 

126 assert ( 

127 ".ghdl_0_36." 

128 in self.get_vivado_simlib( 

129 ghdl_version_string="GHDL 0.36 [Dunoon edition]" 

130 ).artifact_name 

131 ) 

132 assert ( 

133 ".ghdl_0_36_v0_36." 

134 in self.get_vivado_simlib(ghdl_version_string="GHDL 0.36 (v0.36)").artifact_name 

135 ) 

136 assert ".ghdl_0_36" in self.get_vivado_simlib(ghdl_version_string="GHDL 0.36").artifact_name 

137 

138 assert ( 

139 ".ghdl_0_37_dev_v0_36_1605_ge4aa89cd" 

140 in self.get_vivado_simlib( 

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

142 ).artifact_name 

143 ) 

144 assert ( 

145 ".ghdl_0_37_dev_v0_36_1605_ge4aa89cd." 

146 in self.get_vivado_simlib( 

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

148 ).artifact_name 

149 ) 

150 

151 @staticmethod 

152 def assert_should_compile(vivado_simlib): 

153 assert vivado_simlib.compile_is_needed 

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

155 vivado_simlib.compile_if_needed() 

156 mock.assert_called_once() 

157 

158 @staticmethod 

159 def assert_should_not_compile(vivado_simlib): 

160 assert not vivado_simlib.compile_is_needed 

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

162 vivado_simlib.compile_if_needed() 

163 mock.assert_not_called()