siliconcompiler 0.32.1__py3-none-any.whl → 0.32.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. siliconcompiler/_metadata.py +3 -2
  2. siliconcompiler/apps/sc_install.py +13 -5
  3. siliconcompiler/apps/sc_remote.py +2 -1
  4. siliconcompiler/core.py +68 -55
  5. siliconcompiler/issue.py +3 -1
  6. siliconcompiler/remote/client.py +55 -16
  7. siliconcompiler/report/__init__.py +3 -2
  8. siliconcompiler/report/dashboard/__init__.py +61 -170
  9. siliconcompiler/report/dashboard/cli/__init__.py +788 -0
  10. siliconcompiler/report/dashboard/web/__init__.py +196 -0
  11. siliconcompiler/report/dashboard/{components → web/components}/__init__.py +4 -4
  12. siliconcompiler/report/dashboard/{components → web/components}/graph.py +1 -1
  13. siliconcompiler/report/dashboard/{layouts → web/layouts}/__init__.py +3 -3
  14. siliconcompiler/report/dashboard/{layouts → web/layouts}/_common.py +1 -1
  15. siliconcompiler/report/dashboard/{layouts → web/layouts}/vertical_flowgraph.py +5 -5
  16. siliconcompiler/report/dashboard/{layouts → web/layouts}/vertical_flowgraph_node_tab.py +6 -6
  17. siliconcompiler/report/dashboard/{layouts → web/layouts}/vertical_flowgraph_sac_tabs.py +6 -6
  18. siliconcompiler/report/dashboard/{viewer.py → web/viewer.py} +4 -4
  19. siliconcompiler/scheduler/__init__.py +44 -13
  20. siliconcompiler/scheduler/docker_runner.py +2 -1
  21. siliconcompiler/sphinx_ext/dynamicgen.py +11 -11
  22. siliconcompiler/templates/replay/replay.sh.j2 +2 -2
  23. siliconcompiler/templates/tcl/manifest.tcl.j2 +4 -120
  24. siliconcompiler/tools/_common/__init__.py +2 -0
  25. siliconcompiler/tools/_common/tcl/sc_schema_access.tcl +126 -0
  26. siliconcompiler/tools/openroad/_apr.py +7 -0
  27. siliconcompiler/tools/openroad/fillmetal_insertion.py +14 -14
  28. siliconcompiler/tools/openroad/scripts/apr/sc_antenna_repair.tcl +1 -1
  29. siliconcompiler/tools/openroad/scripts/apr/sc_clock_tree_synthesis.tcl +1 -1
  30. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_placement.tcl +1 -1
  31. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +1 -1
  32. siliconcompiler/tools/openroad/scripts/apr/sc_endcap_tapcell_insertion.tcl +1 -1
  33. siliconcompiler/tools/openroad/scripts/apr/sc_fillercell_insertion.tcl +1 -1
  34. siliconcompiler/tools/openroad/scripts/apr/sc_fillmetal_insertion.tcl +2 -2
  35. siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl +1 -1
  36. siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +1 -1
  37. siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +1 -1
  38. siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl +1 -1
  39. siliconcompiler/tools/openroad/scripts/apr/sc_metrics.tcl +1 -1
  40. siliconcompiler/tools/openroad/scripts/apr/sc_pin_placement.tcl +1 -1
  41. siliconcompiler/tools/openroad/scripts/apr/sc_power_grid.tcl +1 -1
  42. siliconcompiler/tools/openroad/scripts/apr/sc_repair_design.tcl +1 -1
  43. siliconcompiler/tools/openroad/scripts/apr/sc_repair_timing.tcl +54 -8
  44. siliconcompiler/tools/openroad/scripts/apr/sc_write_data.tcl +1 -1
  45. siliconcompiler/tools/openroad/scripts/common/procs.tcl +19 -1
  46. siliconcompiler/tools/openroad/scripts/common/reports.tcl +18 -7
  47. siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +1 -1
  48. siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +1 -1
  49. siliconcompiler/tools/openroad/scripts/sc_show.tcl +1 -1
  50. siliconcompiler/tools/opensta/__init__.py +1 -1
  51. siliconcompiler/tools/opensta/scripts/sc_check_library.tcl +1 -1
  52. siliconcompiler/tools/opensta/scripts/sc_procs.tcl +16 -0
  53. siliconcompiler/tools/opensta/scripts/sc_report_libraries.tcl +1 -1
  54. siliconcompiler/tools/opensta/scripts/sc_timing.tcl +35 -7
  55. siliconcompiler/tools/opensta/timing.py +6 -2
  56. siliconcompiler/tools/slang/__init__.py +7 -8
  57. siliconcompiler/tools/sv2v/sv2v.py +4 -1
  58. siliconcompiler/tools/yosys/__init__.py +4 -36
  59. siliconcompiler/tools/yosys/lec.py +3 -4
  60. siliconcompiler/tools/yosys/{syn_asic.tcl → sc_synth_asic.tcl} +87 -0
  61. siliconcompiler/tools/yosys/{syn_fpga.tcl → sc_synth_fpga.tcl} +78 -0
  62. siliconcompiler/tools/yosys/syn_asic.py +36 -11
  63. siliconcompiler/tools/yosys/syn_fpga.py +23 -16
  64. siliconcompiler/toolscripts/_tools.json +23 -9
  65. siliconcompiler/toolscripts/rhel8/install-chisel.sh +2 -0
  66. siliconcompiler/toolscripts/rhel8/install-icarus.sh +1 -0
  67. siliconcompiler/toolscripts/rhel8/install-klayout.sh +2 -0
  68. siliconcompiler/toolscripts/rhel8/install-magic.sh +1 -2
  69. siliconcompiler/toolscripts/rhel8/install-netgen.sh +1 -1
  70. siliconcompiler/toolscripts/rhel8/install-slang.sh +2 -0
  71. siliconcompiler/toolscripts/rhel8/install-surelog.sh +3 -1
  72. siliconcompiler/toolscripts/rhel8/install-sv2v.sh +1 -0
  73. siliconcompiler/toolscripts/rhel8/install-verible.sh +2 -0
  74. siliconcompiler/toolscripts/rhel8/install-verilator.sh +1 -0
  75. siliconcompiler/toolscripts/rhel8/install-xyce.sh +2 -0
  76. siliconcompiler/toolscripts/rhel9/install-chisel.sh +2 -0
  77. siliconcompiler/toolscripts/rhel9/install-ghdl.sh +1 -0
  78. siliconcompiler/toolscripts/rhel9/install-gtkwave.sh +2 -1
  79. siliconcompiler/toolscripts/rhel9/install-icarus.sh +1 -0
  80. siliconcompiler/toolscripts/rhel9/install-klayout.sh +2 -0
  81. siliconcompiler/toolscripts/rhel9/install-magic.sh +1 -2
  82. siliconcompiler/toolscripts/rhel9/install-netgen.sh +1 -1
  83. siliconcompiler/toolscripts/rhel9/install-openroad.sh +2 -0
  84. siliconcompiler/toolscripts/rhel9/install-opensta.sh +76 -0
  85. siliconcompiler/toolscripts/rhel9/install-slang.sh +3 -1
  86. siliconcompiler/toolscripts/rhel9/install-surelog.sh +2 -1
  87. siliconcompiler/toolscripts/rhel9/install-sv2v.sh +1 -0
  88. siliconcompiler/toolscripts/rhel9/install-verible.sh +2 -0
  89. siliconcompiler/toolscripts/rhel9/install-verilator.sh +1 -0
  90. siliconcompiler/toolscripts/rhel9/install-vpr.sh +31 -0
  91. siliconcompiler/toolscripts/rhel9/install-xdm.sh +2 -0
  92. siliconcompiler/toolscripts/rhel9/install-xyce.sh +2 -0
  93. siliconcompiler/toolscripts/rhel9/install-yosys-moosic.sh +2 -0
  94. siliconcompiler/toolscripts/rhel9/install-yosys-parmys.sh +61 -0
  95. siliconcompiler/toolscripts/rhel9/install-yosys-slang.sh +3 -1
  96. siliconcompiler/toolscripts/rhel9/install-yosys.sh +2 -0
  97. siliconcompiler/toolscripts/ubuntu20/install-bambu.sh +2 -0
  98. siliconcompiler/toolscripts/ubuntu20/install-bluespec.sh +2 -0
  99. siliconcompiler/toolscripts/ubuntu20/install-chisel.sh +2 -0
  100. siliconcompiler/toolscripts/ubuntu20/install-ghdl.sh +2 -0
  101. siliconcompiler/toolscripts/ubuntu20/install-gtkwave.sh +2 -0
  102. siliconcompiler/toolscripts/ubuntu20/install-icarus.sh +2 -0
  103. siliconcompiler/toolscripts/ubuntu20/install-icepack.sh +2 -0
  104. siliconcompiler/toolscripts/ubuntu20/install-klayout.sh +2 -0
  105. siliconcompiler/toolscripts/ubuntu20/install-magic.sh +2 -0
  106. siliconcompiler/toolscripts/ubuntu20/install-netgen.sh +2 -0
  107. siliconcompiler/toolscripts/ubuntu20/install-nextpnr.sh +1 -3
  108. siliconcompiler/toolscripts/ubuntu20/install-openroad.sh +2 -0
  109. siliconcompiler/toolscripts/ubuntu20/install-opensta.sh +72 -0
  110. siliconcompiler/toolscripts/ubuntu20/install-slang.sh +3 -1
  111. siliconcompiler/toolscripts/ubuntu20/install-slurm.sh +2 -0
  112. siliconcompiler/toolscripts/ubuntu20/install-surelog.sh +3 -1
  113. siliconcompiler/toolscripts/ubuntu20/install-sv2v.sh +1 -1
  114. siliconcompiler/toolscripts/ubuntu20/install-verible.sh +2 -0
  115. siliconcompiler/toolscripts/ubuntu20/install-verilator.sh +2 -0
  116. siliconcompiler/toolscripts/ubuntu20/install-vpr.sh +2 -0
  117. siliconcompiler/toolscripts/ubuntu20/install-xdm.sh +2 -0
  118. siliconcompiler/toolscripts/ubuntu20/install-xyce.sh +2 -0
  119. siliconcompiler/toolscripts/ubuntu20/install-yosys-moosic.sh +2 -0
  120. siliconcompiler/toolscripts/ubuntu20/install-yosys-parmys.sh +61 -0
  121. siliconcompiler/toolscripts/ubuntu20/install-yosys.sh +2 -0
  122. siliconcompiler/toolscripts/ubuntu22/install-bambu.sh +2 -0
  123. siliconcompiler/toolscripts/ubuntu22/install-bluespec.sh +27 -2
  124. siliconcompiler/toolscripts/ubuntu22/install-chisel.sh +2 -0
  125. siliconcompiler/toolscripts/ubuntu22/install-ghdl.sh +4 -2
  126. siliconcompiler/toolscripts/ubuntu22/install-gtkwave.sh +2 -0
  127. siliconcompiler/toolscripts/ubuntu22/install-icarus.sh +2 -0
  128. siliconcompiler/toolscripts/ubuntu22/install-icepack.sh +2 -0
  129. siliconcompiler/toolscripts/ubuntu22/install-klayout.sh +2 -0
  130. siliconcompiler/toolscripts/ubuntu22/install-magic.sh +2 -0
  131. siliconcompiler/toolscripts/ubuntu22/install-netgen.sh +2 -0
  132. siliconcompiler/toolscripts/ubuntu22/install-nextpnr.sh +1 -2
  133. siliconcompiler/toolscripts/ubuntu22/install-openroad.sh +2 -0
  134. siliconcompiler/toolscripts/ubuntu22/install-opensta.sh +72 -0
  135. siliconcompiler/toolscripts/ubuntu22/install-slang.sh +3 -1
  136. siliconcompiler/toolscripts/ubuntu22/install-slurm.sh +2 -0
  137. siliconcompiler/toolscripts/ubuntu22/install-surelog.sh +3 -1
  138. siliconcompiler/toolscripts/ubuntu22/install-sv2v.sh +1 -1
  139. siliconcompiler/toolscripts/ubuntu22/install-verible.sh +2 -0
  140. siliconcompiler/toolscripts/ubuntu22/install-verilator.sh +2 -0
  141. siliconcompiler/toolscripts/ubuntu22/install-vpr.sh +2 -0
  142. siliconcompiler/toolscripts/ubuntu22/install-xdm.sh +2 -0
  143. siliconcompiler/toolscripts/ubuntu22/install-xyce.sh +2 -0
  144. siliconcompiler/toolscripts/ubuntu22/install-yosys-moosic.sh +2 -0
  145. siliconcompiler/toolscripts/ubuntu22/install-yosys-parmys.sh +61 -0
  146. siliconcompiler/toolscripts/ubuntu22/install-yosys-slang.sh +3 -1
  147. siliconcompiler/toolscripts/ubuntu22/install-yosys.sh +2 -0
  148. siliconcompiler/toolscripts/ubuntu24/install-bambu.sh +2 -0
  149. siliconcompiler/toolscripts/ubuntu24/install-bluespec.sh +2 -0
  150. siliconcompiler/toolscripts/ubuntu24/install-chisel.sh +2 -0
  151. siliconcompiler/toolscripts/ubuntu24/install-ghdl.sh +4 -2
  152. siliconcompiler/toolscripts/ubuntu24/install-gtkwave.sh +2 -0
  153. siliconcompiler/toolscripts/ubuntu24/install-icarus.sh +2 -0
  154. siliconcompiler/toolscripts/ubuntu24/install-icepack.sh +2 -0
  155. siliconcompiler/toolscripts/ubuntu24/install-klayout.sh +2 -0
  156. siliconcompiler/toolscripts/ubuntu24/install-magic.sh +2 -0
  157. siliconcompiler/toolscripts/ubuntu24/install-netgen.sh +2 -0
  158. siliconcompiler/toolscripts/ubuntu24/install-nextpnr.sh +1 -3
  159. siliconcompiler/toolscripts/ubuntu24/install-openroad.sh +2 -0
  160. siliconcompiler/toolscripts/ubuntu24/install-opensta.sh +72 -0
  161. siliconcompiler/toolscripts/ubuntu24/install-slang.sh +3 -1
  162. siliconcompiler/toolscripts/ubuntu24/install-slurm.sh +2 -0
  163. siliconcompiler/toolscripts/ubuntu24/install-surelog.sh +3 -1
  164. siliconcompiler/toolscripts/ubuntu24/install-sv2v.sh +1 -1
  165. siliconcompiler/toolscripts/ubuntu24/install-verible.sh +2 -0
  166. siliconcompiler/toolscripts/ubuntu24/install-verilator.sh +2 -0
  167. siliconcompiler/toolscripts/ubuntu24/install-vpr.sh +2 -0
  168. siliconcompiler/toolscripts/ubuntu24/install-xdm.sh +2 -0
  169. siliconcompiler/toolscripts/ubuntu24/install-xyce.sh +2 -0
  170. siliconcompiler/toolscripts/ubuntu24/install-yosys-moosic.sh +2 -0
  171. siliconcompiler/toolscripts/ubuntu24/install-yosys-parmys.sh +61 -0
  172. siliconcompiler/toolscripts/ubuntu24/install-yosys-slang.sh +3 -1
  173. siliconcompiler/toolscripts/ubuntu24/install-yosys.sh +2 -0
  174. siliconcompiler/utils/__init__.py +4 -1
  175. siliconcompiler/utils/logging.py +88 -34
  176. {siliconcompiler-0.32.1.dist-info → siliconcompiler-0.32.3.dist-info}/METADATA +14 -10
  177. {siliconcompiler-0.32.1.dist-info → siliconcompiler-0.32.3.dist-info}/RECORD +185 -175
  178. {siliconcompiler-0.32.1.dist-info → siliconcompiler-0.32.3.dist-info}/WHEEL +1 -1
  179. siliconcompiler/tools/yosys/sc_syn.tcl +0 -87
  180. siliconcompiler/toolscripts/ubuntu20/install-yosys-slang.sh +0 -22
  181. /siliconcompiler/report/dashboard/{components → web/components}/flowgraph.py +0 -0
  182. /siliconcompiler/report/dashboard/{state.py → web/state.py} +0 -0
  183. /siliconcompiler/report/dashboard/{utils → web/utils}/__init__.py +0 -0
  184. /siliconcompiler/report/dashboard/{utils → web/utils}/file_utils.py +0 -0
  185. {siliconcompiler-0.32.1.dist-info → siliconcompiler-0.32.3.dist-info}/entry_points.txt +0 -0
  186. {siliconcompiler-0.32.1.dist-info → siliconcompiler-0.32.3.dist-info/licenses}/LICENSE +0 -0
  187. {siliconcompiler-0.32.1.dist-info → siliconcompiler-0.32.3.dist-info}/top_level.txt +0 -0
@@ -1,190 +1,81 @@
1
- import os
2
- import time
3
- import tempfile
4
- import json
1
+ from abc import ABC, abstractmethod
2
+ from enum import Enum
5
3
 
6
- import multiprocessing
7
- import subprocess
8
- import atexit
9
- import shutil
10
- import fasteners
11
- import signal
12
- import socketserver
13
4
 
14
- from siliconcompiler.report.dashboard import utils
5
+ class DashboardType(Enum):
6
+ WEB = 'web'
7
+ CLI = 'cli'
15
8
 
16
- try:
17
- from streamlit.web import bootstrap
18
- from streamlit import config as _config
19
- except ModuleNotFoundError:
20
- bootstrap = None
21
- _config = None
22
9
 
10
+ class AbstractDashboard(ABC):
11
+ """
12
+ Abstract base class defining the interface for dashboard implementations.
13
+ Any concrete dashboard implementation should inherit from this class and
14
+ implement all abstract methods.
15
+ """
23
16
 
24
- class Dashboard():
25
- __port = 8501
17
+ @abstractmethod
18
+ def __init__(self, chip):
19
+ """
20
+ Initialize the dashboard.
26
21
 
27
- @staticmethod
28
- def __signal_handler(signal, frame):
29
- # used to avoid issues during shutdown
30
- pass
31
-
32
- def __init__(self, chip, port=None, graph_chips=None):
33
- if not bootstrap:
34
- raise NotImplementedError('streamlit is not available')
35
-
36
- if not port:
37
- port = Dashboard.get_next_port()
38
- if not port:
39
- port = Dashboard.__port
40
-
41
- self.__dashboard = None
42
- self.__chip = chip
43
- self.__directory = tempfile.mkdtemp(prefix='sc_dashboard_',
44
- suffix=f'_{self.__chip.design}')
45
- self.__manifest = os.path.join(self.__directory, 'manifest.json')
46
- self.__manifest_lock = os.path.join(self.__directory, 'manifest.lock')
47
- self.__port = port
48
- dirname = os.path.dirname(__file__)
49
- self.__streamlit_file = os.path.join(dirname, 'viewer.py')
50
-
51
- self.__streamlit_args = [
52
- ("browser.gatherUsageStats", False),
53
- ("browser.serverPort", self.__port),
54
- ("logger.level", 'error'),
55
- ("runner.fastReruns", True),
56
- ("server.port", self.__port),
57
- ("client.toolbarMode", "viewer")
58
- ]
59
-
60
- # pass in a json object called __graph_chips
61
- # the key is the chip_name and value is the filepath
62
- # if another argument is passed
63
-
64
- # use of list is to preserve order
65
- self.__graph_chips = []
66
- graph_chips_config = []
67
- if graph_chips:
68
- for chip_object_and_name in graph_chips:
69
- chip_file_path = \
70
- os.path.join(self.__directory,
71
- f"{chip_object_and_name['name']}.json")
72
- self.__graph_chips.append({
73
- 'chip': chip_object_and_name['chip'],
74
- 'name': chip_file_path
75
- })
76
- graph_chips_config.append({
77
- "path": chip_file_path,
78
- "cwd": utils.get_chip_cwd(
79
- chip_object_and_name['chip'],
80
- chip_object_and_name['cfg_path'])
81
- })
82
-
83
- self.__config = {
84
- "manifest": self.__manifest,
85
- "lock": self.__manifest_lock,
86
- "graph_chips": graph_chips_config
87
- }
88
-
89
- self.__sleep_time = 0.5
90
- self.__signal_handler = None
91
-
92
- self.__lock = fasteners.InterProcessLock(self.__manifest_lock)
93
-
94
- atexit.register(self.__cleanup)
22
+ Args:
23
+ chip: The chip object to display in the dashboard
24
+ """
25
+ self._chip = chip
95
26
 
27
+ @abstractmethod
96
28
  def open_dashboard(self):
97
- with open(self.__get_config_file(), 'w') as f:
98
- json.dump(self.__config, f, indent=4)
99
-
100
- self.update_manifest()
101
-
102
- self.update_graph_manifests()
103
-
104
- self.__dashboard = multiprocessing.Process(
105
- target=self._run_streamlit_bootstrap)
106
-
107
- self.__signal_handler = signal.signal(signal.SIGINT, Dashboard.__signal_handler)
108
-
109
- self.__dashboard.start()
110
-
111
- def update_manifest(self):
112
- if not self.__manifest:
113
- return
29
+ """
30
+ Open and start the dashboard service.
31
+ """
32
+ pass
114
33
 
115
- new_file = f"{self.__manifest}.new.json"
116
- self.__chip.write_manifest(new_file)
34
+ @abstractmethod
35
+ def update_manifest(self, payload=None):
36
+ """
37
+ Update the manifest file with the latest chip information.
117
38
 
118
- with self.__lock:
119
- shutil.move(new_file, self.__manifest)
39
+ Args:
40
+ payload (dict): Dictionary of metadata to pass along to dashboard.
41
+ {"starttimes" {<node>: time, ...}}
42
+ """
43
+ pass
120
44
 
45
+ @abstractmethod
121
46
  def update_graph_manifests(self):
122
- for chip_object_and_name in self.__graph_chips:
123
- chip = chip_object_and_name['chip']
124
- file_path = chip_object_and_name['name']
125
- chip.write_manifest(file_path)
126
-
127
- def __get_config_file(self):
128
- return os.path.join(self.__directory, 'config.json')
47
+ """
48
+ Update the manifest files for all graph chips.
49
+ """
50
+ pass
129
51
 
52
+ @abstractmethod
130
53
  def is_running(self):
131
- if self.__dashboard is None:
132
- return False
54
+ """
55
+ Check if the dashboard is currently running.
133
56
 
134
- if self.__dashboard.is_alive():
135
- return True
57
+ Returns:
58
+ bool: True if the dashboard is running, False otherwise
59
+ """
60
+ pass
136
61
 
137
- self.__dashboard = None
138
- self.__manifest = None
139
- return False
62
+ @abstractmethod
63
+ def end_of_run(self):
64
+ """
65
+ Announce that a run has completed
66
+ """
67
+ pass
140
68
 
69
+ @abstractmethod
141
70
  def stop(self):
142
- if not self.is_running():
143
- return
144
-
145
- while self.__dashboard.is_alive():
146
- self.__dashboard.terminate()
147
- self._sleep()
148
-
149
- if self.__signal_handler:
150
- signal.signal(signal.SIGINT, self.__signal_handler)
151
-
152
- self.__dashboard = None
153
- self.__manifest = None
154
- self.__signal_handler = None
71
+ """
72
+ Stop the dashboard service if it's running.
73
+ """
74
+ pass
155
75
 
76
+ @abstractmethod
156
77
  def wait(self):
157
- self.__dashboard.join()
158
-
159
- def _sleep(self):
160
- time.sleep(self.__sleep_time)
161
-
162
- def _run_streamlit_bootstrap(self):
163
- for config, val in self.__streamlit_args:
164
- _config.set_option(config, val)
165
-
166
- bootstrap.run(self.__streamlit_file,
167
- False,
168
- [self.__get_config_file()],
169
- flag_options={})
170
-
171
- def __run_streamlit_subproc(self):
172
- cmd = ['streamlit', 'run',
173
- self.__streamlit_file, self.__get_config_file()]
174
- for config, val in self.__streamlit_args:
175
- cmd.append(f'--{config}')
176
- cmd.append(val)
177
-
178
- subprocess.Popen(cmd)
179
-
180
- def __cleanup(self):
181
- self.stop()
182
-
183
- if os.path.exists(self.__directory):
184
- shutil.rmtree(self.__directory)
185
-
186
- @staticmethod
187
- def get_next_port():
188
- with socketserver.TCPServer(("localhost", 0), None) as s:
189
- return s.server_address[1]
190
- return None
78
+ """
79
+ Wait for the dashboard service to terminate.
80
+ """
81
+ pass