siliconcompiler 0.31.0__py3-none-any.whl → 0.31.1__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.
@@ -1,5 +1,5 @@
1
1
  # Version number following semver standard.
2
- version = '0.31.0'
2
+ version = '0.31.1'
3
3
 
4
4
  # Default server address for remote runs, if unspecified.
5
5
  default_server = 'https://server.siliconcompiler.com'
@@ -101,6 +101,19 @@ def print_machine_info():
101
101
  print("Scripts: ", _get_tool_script_dir())
102
102
 
103
103
 
104
+ def __print_summary(successful, failed):
105
+ max_len = 64
106
+ print("#"*max_len)
107
+ if successful:
108
+ msg = f"Installed: {', '.join(sorted(successful))}"
109
+ print(f"# {msg}")
110
+
111
+ if failed:
112
+ msg = f"Failed to install: {failed}"
113
+ print(f"# {msg}")
114
+ print("#"*max_len)
115
+
116
+
104
117
  def _get_tool_script_dir():
105
118
  return Path(siliconcompiler.__file__).parent / "toolscripts"
106
119
 
@@ -242,6 +255,7 @@ To system debugging information (this should only be used to debug):
242
255
  args.tool.extend(tool_groups[group])
243
256
 
244
257
  tools_handled = set()
258
+ tools_completed = set()
245
259
  for tool in args.tool:
246
260
  if tool in tools_handled:
247
261
  continue
@@ -250,9 +264,14 @@ To system debugging information (this should only be used to debug):
250
264
  show_tool(tool, tools[tool])
251
265
  else:
252
266
  if not install_tool(tool, tools[tool], args.build_dir, args.prefix):
267
+ __print_summary(tools_completed, tool)
253
268
  return 1
269
+ else:
270
+ tools_completed.add(tool)
254
271
 
255
272
  if not args.show:
273
+ __print_summary(tools_completed, None)
274
+
256
275
  msgs = []
257
276
  for env, path in (
258
277
  ("PATH", "bin"),
@@ -262,7 +281,6 @@ To system debugging information (this should only be used to debug):
262
281
  os.path.expandvars(os.path.expanduser(p))
263
282
  for p in os.getenv(env, "").split(":")
264
283
  ]
265
- print(envs)
266
284
  if check_path not in envs:
267
285
  msgs.extend([
268
286
  "",
siliconcompiler/core.py CHANGED
@@ -2950,7 +2950,7 @@ class Chip:
2950
2950
  elif os.path.isfile(results_html):
2951
2951
  _open_html_report(self, results_html)
2952
2952
  else:
2953
- self._dashboard(wait=False)
2953
+ self.dashboard(wait=False)
2954
2954
 
2955
2955
  ###########################################################################
2956
2956
  def clock(self, pin, period, jitter=0, mode='global'):
@@ -1,25 +1,20 @@
1
1
  import os
2
- import requests
3
- import tarfile
4
- import zipfile
5
- from git import Repo, GitCommandError
6
2
  from urllib.parse import urlparse
7
3
  import importlib
8
- import shutil
9
4
  import re
10
5
  from siliconcompiler import SiliconCompilerError
11
6
  from siliconcompiler.utils import default_cache_dir, _resolve_env_vars
12
7
  import json
13
8
  from importlib.metadata import distributions, distribution
14
9
  import functools
15
- import fasteners
16
10
  import time
17
11
  from pathlib import Path
18
- from io import BytesIO
19
12
 
20
13
  from github import Github
21
14
  import github.Auth
22
15
 
16
+ from siliconcompiler.utils import get_plugins
17
+
23
18
 
24
19
  def get_cache_path(chip):
25
20
  cache_path = chip.get('option', 'cachedir')
@@ -33,10 +28,45 @@ def get_cache_path(chip):
33
28
  return cache_path
34
29
 
35
30
 
36
- def _path(chip, package, download_handler):
37
- if package in chip._packages:
38
- return chip._packages[package]
31
+ def get_download_cache_path(chip, package, ref):
32
+ cache_path = get_cache_path(chip)
33
+ if not os.path.exists(cache_path):
34
+ os.makedirs(cache_path, exist_ok=True)
35
+
36
+ if ref is None:
37
+ raise SiliconCompilerError(f'Reference is required for cached data: {package}', chip=chip)
38
+
39
+ return \
40
+ os.path.join(cache_path, f'{package}-{ref}'), \
41
+ os.path.join(cache_path, f'{package}-{ref}.lock')
42
+
43
+
44
+ def _file_path_resolver(chip, package, path, ref, url):
45
+ return os.path.abspath(path.replace('file://', ''))
46
+
47
+
48
+ def _python_path_resolver(chip, package, path, ref, url):
49
+ return path_from_python(chip, url.netloc)
39
50
 
51
+
52
+ def _get_path_resolver(path):
53
+ url = urlparse(path)
54
+
55
+ for resolver in get_plugins("path_resolver"):
56
+ func = resolver(url)
57
+ if func:
58
+ return func, url
59
+
60
+ if url.scheme == "file":
61
+ return _file_path_resolver, url
62
+
63
+ if url.scheme == "python":
64
+ return _python_path_resolver, url
65
+
66
+ raise ValueError(f"{path} is not supported")
67
+
68
+
69
+ def _path(chip, package):
40
70
  # Initially try retrieving data source from schema
41
71
  data = {}
42
72
  data['path'] = chip.get('package', 'source', package, 'path')
@@ -48,48 +78,13 @@ def _path(chip, package, download_handler):
48
78
 
49
79
  data['path'] = _resolve_env_vars(chip, data['path'], None, None)
50
80
 
51
- url = urlparse(data['path'])
52
-
53
- # check network drive for package data source
54
- if data['path'].startswith('file://') or os.path.exists(data['path']):
55
- path = os.path.abspath(data['path'].replace('file://', ''))
56
- chip.logger.info(f'Found {package} data at {path}')
57
- chip._packages[package] = path
58
- return path
59
- elif data['path'].startswith('python://'):
60
- path = path_from_python(chip, url.netloc)
61
- chip.logger.info(f'Found {package} data at {path}')
62
- chip._packages[package] = path
63
- return path
64
-
65
- # location of the python package
66
- cache_path = get_cache_path(chip)
67
- if not os.path.exists(cache_path):
68
- os.makedirs(cache_path, exist_ok=True)
69
- project_id = f'{package}-{data.get("ref")}'
70
- if url.scheme not in ['git', 'git+https', 'https', 'git+ssh', 'ssh'] or not project_id:
71
- raise SiliconCompilerError(
72
- f'Could not find data path in package {package}: {data["path"]}',
73
- chip=chip)
74
-
75
- data_path = os.path.join(cache_path, project_id)
76
-
77
- if download_handler:
78
- download_handler(chip,
79
- package,
80
- data,
81
- url,
82
- data_path,
83
- os.path.join(cache_path, f'{project_id}.lock'))
84
-
85
- if os.path.exists(data_path):
86
- if package not in chip._packages:
87
- chip.logger.info(f'Saved {package} data to {data_path}')
88
- chip._packages[package] = data_path
89
- return data_path
81
+ if os.path.exists(data['path']):
82
+ # Path is already a path
83
+ return os.path.abspath(data['path'])
90
84
 
91
- raise SiliconCompilerError(f'Extracting {package} data to {data_path} failed',
92
- chip=chip)
85
+ path_resolver, url = _get_path_resolver(data['path'])
86
+
87
+ return path_resolver(chip, package, data['path'], data['ref'], url)
93
88
 
94
89
 
95
90
  def path(chip, package):
@@ -102,40 +97,25 @@ def path(chip, package):
102
97
  path: Location of data source on the local system
103
98
  """
104
99
 
105
- return _path(chip, package, __download_data)
106
-
100
+ if package not in chip._packages:
101
+ changed = False
102
+ data_path = _path(chip, package)
107
103
 
108
- def __download_data(chip, package, data, url, data_path, data_path_lock):
109
- data_lock = fasteners.InterProcessLock(data_path_lock)
104
+ if isinstance(data_path, tuple) and len(data_path) == 2:
105
+ data_path, changed = data_path
110
106
 
111
- _aquire_data_lock(data_path, data_lock)
107
+ if os.path.exists(data_path):
108
+ if package not in chip._packages and changed:
109
+ chip.logger.info(f'Saved {package} data to {data_path}')
110
+ else:
111
+ chip.logger.info(f'Found {package} data at {data_path}')
112
112
 
113
- # check cached package data source
114
- if os.path.exists(data_path):
115
- chip.logger.info(f'Found cached {package} data at {data_path}')
116
- if url.scheme in ['git', 'git+https', 'ssh', 'git+ssh']:
117
- try:
118
- repo = Repo(data_path)
119
- if repo.untracked_files or repo.index.diff("HEAD"):
120
- chip.logger.warning('The repo of the cached data is dirty.')
121
- _release_data_lock(data_lock)
122
- chip._packages[package] = data_path
123
- return
124
- except GitCommandError:
125
- chip.logger.warning('Deleting corrupted cache data.')
126
- shutil.rmtree(path)
127
- else:
128
- _release_data_lock(data_lock)
129
113
  chip._packages[package] = data_path
130
- return
131
-
132
- # download package data source
133
- if url.scheme in ['git', 'git+https', 'ssh', 'git+ssh']:
134
- clone_synchronized(chip, package, data, data_path)
135
- elif url.scheme == 'https':
136
- extract_from_url(chip, package, data, data_path)
114
+ else:
115
+ raise SiliconCompilerError(f'Unable to locate {package} data in {data_path}',
116
+ chip=chip)
137
117
 
138
- _release_data_lock(data_lock)
118
+ return chip._packages[package]
139
119
 
140
120
 
141
121
  def __get_filebased_lock(data_lock):
@@ -143,7 +123,7 @@ def __get_filebased_lock(data_lock):
143
123
  return Path(f'{base}.sc_lock')
144
124
 
145
125
 
146
- def _aquire_data_lock(data_path, data_lock):
126
+ def aquire_data_lock(data_path, data_lock):
147
127
  # Wait a maximum of 10 minutes for other processes to finish
148
128
  max_seconds = 10 * 60
149
129
  try:
@@ -168,7 +148,7 @@ def _aquire_data_lock(data_path, data_lock):
168
148
  'please delete it.')
169
149
 
170
150
 
171
- def _release_data_lock(data_lock):
151
+ def release_data_lock(data_lock):
172
152
  # Check if file based locking method was used
173
153
  lock_file = __get_filebased_lock(data_lock)
174
154
  if lock_file.exists():
@@ -178,100 +158,6 @@ def _release_data_lock(data_lock):
178
158
  data_lock.release()
179
159
 
180
160
 
181
- def clone_synchronized(chip, package, data, data_path):
182
- url = urlparse(data['path'])
183
- try:
184
- clone_from_git(chip, package, data, data_path)
185
- except GitCommandError as e:
186
- if 'Permission denied' in repr(e):
187
- if url.scheme in ['ssh', 'git+ssh']:
188
- chip.logger.error('Failed to authenticate. Please setup your git ssh.')
189
- elif url.scheme in ['git', 'git+https']:
190
- chip.logger.error('Failed to authenticate. Please use a token or ssh.')
191
- else:
192
- chip.logger.error(str(e))
193
-
194
-
195
- def clone_from_git(chip, package, data, repo_path):
196
- url = urlparse(data['path'])
197
- if url.scheme in ['git', 'git+https'] and url.username:
198
- chip.logger.warning('Your token is in the data source path and will be stored in the '
199
- 'schema. If you do not want this set the env variable GIT_TOKEN '
200
- 'or use ssh for authentication.')
201
- if url.scheme in ['git+ssh', 'ssh']:
202
- chip.logger.info(f'Cloning {package} data from {url.netloc}:{url.path[1:]}')
203
- # Git requires the format git@github.com:org/repo instead of git@github.com/org/repo
204
- repo = Repo.clone_from(f'{url.netloc}:{url.path[1:]}',
205
- repo_path,
206
- recurse_submodules=True)
207
- else:
208
- if os.environ.get('GIT_TOKEN') and not url.username:
209
- url = url._replace(netloc=f'{os.environ.get("GIT_TOKEN")}@{url.hostname}')
210
- url = url._replace(scheme='https')
211
- chip.logger.info(f'Cloning {package} data from {url.geturl()}')
212
- repo = Repo.clone_from(url.geturl(), repo_path, recurse_submodules=True)
213
- chip.logger.info(f'Checking out {data["ref"]}')
214
- repo.git.checkout(data["ref"])
215
- for submodule in repo.submodules:
216
- submodule.update(init=True)
217
-
218
-
219
- def extract_from_url(chip, package, data, data_path):
220
- url = urlparse(data['path'])
221
- data_url = data.get('path')
222
- headers = {}
223
- if os.environ.get('GIT_TOKEN') or url.username:
224
- headers['Authorization'] = f'token {os.environ.get("GIT_TOKEN") or url.username}'
225
- if "github" in data_url:
226
- headers['Accept'] = 'application/octet-stream'
227
- data_url = data['path']
228
- if data_url.endswith('/'):
229
- data_url = f"{data_url}{data['ref']}.tar.gz"
230
- chip.logger.info(f'Downloading {package} data from {data_url}')
231
- response = requests.get(data_url, stream=True, headers=headers)
232
- if not response.ok:
233
- raise SiliconCompilerError(f'Failed to download {package} data source.', chip=chip)
234
-
235
- fileobj = BytesIO(response.content)
236
- try:
237
- with tarfile.open(fileobj=fileobj, mode='r|gz') as tar_ref:
238
- tar_ref.extractall(path=data_path)
239
- except tarfile.ReadError:
240
- fileobj.seek(0)
241
- # Try as zip
242
- with zipfile.ZipFile(fileobj) as zip_ref:
243
- zip_ref.extractall(path=data_path)
244
-
245
- if 'github' in url.netloc and len(os.listdir(data_path)) == 1:
246
- # Github inserts one folder at the highest level of the tar file
247
- # this compensates for this behavior
248
- gh_url = urlparse(data_url)
249
-
250
- repo = gh_url.path.split('/')[2]
251
-
252
- ref = gh_url.path.split('/')[-1]
253
- if repo.endswith('.git'):
254
- ref = data['ref']
255
- elif ref.endswith('.tar.gz'):
256
- ref = ref[0:-7]
257
- elif ref.endswith('.tgz'):
258
- ref = ref[0:-4]
259
- else:
260
- ref = ref.split('.')[0]
261
-
262
- if ref.startswith('v'):
263
- ref = ref[1:]
264
-
265
- github_folder = f"{repo}-{ref}"
266
-
267
- if github_folder in os.listdir(data_path):
268
- # This moves all files one level up
269
- git_path = os.path.join(data_path, github_folder)
270
- for data_file in os.listdir(git_path):
271
- shutil.move(os.path.join(git_path, data_file), data_path)
272
- os.removedirs(git_path)
273
-
274
-
275
161
  def path_from_python(chip, python_package, append_path=None):
276
162
  try:
277
163
  module = importlib.import_module(python_package)
@@ -0,0 +1,81 @@
1
+ import shutil
2
+
3
+ import os.path
4
+
5
+ from git import Repo, GitCommandError
6
+ from fasteners import InterProcessLock
7
+
8
+ from siliconcompiler.package import get_download_cache_path
9
+ from siliconcompiler.package import aquire_data_lock, release_data_lock
10
+
11
+
12
+ def get_resolver(url):
13
+ if url.scheme in ("git", "git+https", "git+ssh", "ssh"):
14
+ return git_resolver
15
+ return None
16
+
17
+
18
+ def git_resolver(chip, package, path, ref, url):
19
+ data_path, data_path_lock = get_download_cache_path(chip, package, ref)
20
+
21
+ # Acquire lock
22
+ data_lock = InterProcessLock(data_path_lock)
23
+ aquire_data_lock(data_path, data_lock)
24
+
25
+ if os.path.exists(data_path):
26
+ try:
27
+ repo = Repo(data_path)
28
+ if repo.untracked_files or repo.index.diff("HEAD"):
29
+ chip.logger.warning('The repo of the cached data is dirty.')
30
+ release_data_lock(data_lock)
31
+ return data_path, False
32
+ except GitCommandError:
33
+ chip.logger.warning('Deleting corrupted cache data.')
34
+ shutil.rmtree(data_path)
35
+
36
+ clone_synchronized(chip, package, path, ref, url, data_path)
37
+
38
+ release_data_lock(data_lock)
39
+
40
+ return data_path, True
41
+
42
+
43
+ def clone_synchronized(chip, package, path, ref, url, data_path):
44
+ try:
45
+ clone_from_git(chip, package, path, ref, url, data_path)
46
+ except GitCommandError as e:
47
+ if 'Permission denied' in repr(e):
48
+ if url.scheme in ['ssh', 'git+ssh']:
49
+ chip.logger.error('Failed to authenticate. Please setup your git ssh.')
50
+ elif url.scheme in ['git', 'git+https']:
51
+ chip.logger.error('Failed to authenticate. Please use a token or ssh.')
52
+ else:
53
+ chip.logger.error(str(e))
54
+
55
+
56
+ def clone_from_git(chip, package, path, ref, url, data_path):
57
+ if url.scheme in ['git', 'git+https'] and url.username:
58
+ chip.logger.warning('Your token is in the data source path and will be stored in the '
59
+ 'schema. If you do not want this set the env variable GIT_TOKEN '
60
+ 'or use ssh for authentication.')
61
+ if url.scheme in ['git+ssh']:
62
+ chip.logger.info(f'Cloning {package} data from {url.netloc}:{url.path[1:]}')
63
+ # Git requires the format git@github.com:org/repo instead of git@github.com/org/repo
64
+ repo = Repo.clone_from(f'{url.netloc}/{url.path[1:]}',
65
+ data_path,
66
+ recurse_submodules=True)
67
+ elif url.scheme in ['ssh']:
68
+ chip.logger.info(f'Cloning {package} data from {path}')
69
+ repo = Repo.clone_from(path,
70
+ data_path,
71
+ recurse_submodules=True)
72
+ else:
73
+ if os.environ.get('GIT_TOKEN') and not url.username:
74
+ url = url._replace(netloc=f'{os.environ.get("GIT_TOKEN")}@{url.hostname}')
75
+ url = url._replace(scheme='https')
76
+ chip.logger.info(f'Cloning {package} data from {url.geturl()}')
77
+ repo = Repo.clone_from(url.geturl(), data_path, recurse_submodules=True)
78
+ chip.logger.info(f'Checking out {ref}')
79
+ repo.git.checkout(ref)
80
+ for submodule in repo.submodules:
81
+ submodule.update(init=True)
@@ -0,0 +1,93 @@
1
+ import requests
2
+ import shutil
3
+ import tarfile
4
+ import zipfile
5
+
6
+ import os.path
7
+
8
+ from fasteners import InterProcessLock
9
+ from io import BytesIO
10
+ from urllib.parse import urlparse
11
+
12
+ from siliconcompiler import SiliconCompilerError
13
+ from siliconcompiler.package import get_download_cache_path
14
+ from siliconcompiler.package import aquire_data_lock, release_data_lock
15
+
16
+
17
+ def get_resolver(url):
18
+ if url.scheme in ("http", "https"):
19
+ return http_resolver
20
+
21
+ return None
22
+
23
+
24
+ def http_resolver(chip, package, path, ref, url):
25
+ data_path, data_path_lock = get_download_cache_path(chip, package, ref)
26
+
27
+ if os.path.exists(data_path):
28
+ return data_path, False
29
+
30
+ # Acquire lock
31
+ data_lock = InterProcessLock(data_path_lock)
32
+ aquire_data_lock(data_path, data_lock)
33
+
34
+ extract_from_url(chip, package, path, ref, url, data_path)
35
+
36
+ release_data_lock(data_lock)
37
+
38
+ return data_path, True
39
+
40
+
41
+ def extract_from_url(chip, package, path, ref, url, data_path):
42
+ data_url = path
43
+ headers = {}
44
+ if os.environ.get('GIT_TOKEN') or url.username:
45
+ headers['Authorization'] = f'token {os.environ.get("GIT_TOKEN") or url.username}'
46
+ if "github" in data_url:
47
+ headers['Accept'] = 'application/octet-stream'
48
+ data_url = path
49
+ if data_url.endswith('/'):
50
+ data_url = f"{data_url}{ref}.tar.gz"
51
+ chip.logger.info(f'Downloading {package} data from {data_url}')
52
+ response = requests.get(data_url, stream=True, headers=headers)
53
+ if not response.ok:
54
+ raise SiliconCompilerError(f'Failed to download {package} data source.', chip=chip)
55
+
56
+ fileobj = BytesIO(response.content)
57
+ try:
58
+ with tarfile.open(fileobj=fileobj, mode='r|gz') as tar_ref:
59
+ tar_ref.extractall(path=data_path)
60
+ except tarfile.ReadError:
61
+ fileobj.seek(0)
62
+ # Try as zip
63
+ with zipfile.ZipFile(fileobj) as zip_ref:
64
+ zip_ref.extractall(path=data_path)
65
+
66
+ if 'github' in url.netloc and len(os.listdir(data_path)) == 1:
67
+ # Github inserts one folder at the highest level of the tar file
68
+ # this compensates for this behavior
69
+ gh_url = urlparse(data_url)
70
+
71
+ repo = gh_url.path.split('/')[2]
72
+
73
+ gh_ref = gh_url.path.split('/')[-1]
74
+ if repo.endswith('.git'):
75
+ gh_ref = ref
76
+ elif gh_ref.endswith('.tar.gz'):
77
+ gh_ref = gh_ref[0:-7]
78
+ elif gh_ref.endswith('.tgz'):
79
+ gh_ref = gh_ref[0:-4]
80
+ else:
81
+ gh_ref = gh_ref.split('.')[0]
82
+
83
+ if gh_ref.startswith('v'):
84
+ gh_ref = gh_ref[1:]
85
+
86
+ github_folder = f"{repo}-{gh_ref}"
87
+
88
+ if github_folder in os.listdir(data_path):
89
+ # This moves all files one level up
90
+ git_path = os.path.join(data_path, github_folder)
91
+ for data_file in os.listdir(git_path):
92
+ shutil.move(os.path.join(git_path, data_file), data_path)
93
+ os.removedirs(git_path)
@@ -1865,6 +1865,22 @@ def kill_process(chip, proc, tool, poll_interval, msg=""):
1865
1865
  utils.terminate_process(proc.pid)
1866
1866
 
1867
1867
 
1868
+ def get_check_node_keys(chip, step, index):
1869
+ tool, task = get_tool_task(chip, step, index)
1870
+
1871
+ # Collect keys to check for changes
1872
+ required = chip.get('tool', tool, 'task', task, 'require', step=step, index=index)
1873
+
1874
+ tool_task_key = ('tool', tool, 'task', task)
1875
+ for key in ('option', 'threads', 'prescript', 'postscript', 'refdir', 'script',):
1876
+ required.append(",".join([*tool_task_key, key]))
1877
+
1878
+ for env_key in chip.getkeys(*tool_task_key, 'env'):
1879
+ required.append(",".join([*tool_task_key, 'env', env_key]))
1880
+
1881
+ return set(sorted(required))
1882
+
1883
+
1868
1884
  def check_node_inputs(chip, step, index):
1869
1885
  from siliconcompiler import Chip # import here to avoid circular import
1870
1886
 
@@ -1918,15 +1934,8 @@ def check_node_inputs(chip, step, index):
1918
1934
  return False
1919
1935
 
1920
1936
  # Collect keys to check for changes
1921
- required = chip.get('tool', tool, 'task', task, 'require', step=step, index=index)
1922
- required.extend(input_chip.get('tool', tool, 'task', task, 'require', step=step, index=index))
1923
-
1924
- tool_task_key = ('tool', tool, 'task', task)
1925
- for key in ('option', 'threads', 'prescript', 'postscript', 'refdir', 'script',):
1926
- required.append(",".join([*tool_task_key, key]))
1927
- for check_chip in (chip, input_chip):
1928
- for env_key in check_chip.getkeys(*tool_task_key, 'env'):
1929
- required.append(",".join([*tool_task_key, 'env', env_key]))
1937
+ required = get_check_node_keys(chip, step, index)
1938
+ required.update(get_check_node_keys(input_chip, step, index))
1930
1939
 
1931
1940
  def print_warning(key, extra=None):
1932
1941
  if extra:
@@ -1937,7 +1946,7 @@ def check_node_inputs(chip, step, index):
1937
1946
  'from previous run')
1938
1947
 
1939
1948
  # Check if keys have been modified
1940
- for check_key in sorted(set(required)):
1949
+ for check_key in required:
1941
1950
  key = check_key.split(',')
1942
1951
 
1943
1952
  if not chip.valid(*key) or not input_chip.valid(*key):
@@ -1,7 +1,7 @@
1
1
  import docker
2
2
  import os
3
3
  from siliconcompiler.package import get_cache_path
4
- from siliconcompiler.package import _path as sc_path
4
+ from siliconcompiler.package import path as sc_path
5
5
  from siliconcompiler.utils import default_email_credentials_file
6
6
  from pathlib import Path
7
7
  import sys
@@ -47,7 +47,7 @@ def get_volumes_directories(chip, cache_dir, workdir, step, index):
47
47
 
48
48
  # Collect caches
49
49
  for package in chip.getkeys('package', 'source'):
50
- all_dirs.add(sc_path(chip, package, None))
50
+ all_dirs.add(sc_path(chip, package))
51
51
 
52
52
  all_dirs = [
53
53
  Path(cache_dir),
@@ -215,7 +215,7 @@ def run(chip, step, index, replay):
215
215
 
216
216
  cachemap = []
217
217
  for package in chip.getkeys('package', 'source'):
218
- cachemap.append(f'{package}:{sc_path(chip, package, None)}')
218
+ cachemap.append(f'{package}:{sc_path(chip, package)}')
219
219
 
220
220
  chip.logger.info(f'Running in docker container: {container.name} ({container.short_id})')
221
221
  args = [
@@ -5,7 +5,7 @@ import os
5
5
  import sys
6
6
  import tarfile
7
7
  from siliconcompiler import Chip, Schema
8
- from siliconcompiler.package import _path as sc_path
8
+ from siliconcompiler.package import path as sc_path
9
9
  from siliconcompiler.scheduler import _runtask, _executenode
10
10
  from siliconcompiler import __version__
11
11
 
@@ -103,9 +103,9 @@ def main():
103
103
  package, path = cachepair.split(':')
104
104
  chip._packages[package] = path
105
105
 
106
- # Populate cache without downloading
106
+ # Populate cache
107
107
  for package in chip.getkeys('package', 'source'):
108
- sc_path(chip, package, None)
108
+ sc_path(chip, package)
109
109
 
110
110
  # Run the task.
111
111
  error = True
@@ -1092,6 +1092,10 @@ class Schema:
1092
1092
 
1093
1093
  tcl_set_cmds = []
1094
1094
  for key in self.allkeys():
1095
+ # print out all non default values
1096
+ if 'default' in key:
1097
+ continue
1098
+
1095
1099
  typestr = self.get(*key, field='type')
1096
1100
  pernode = self.get(*key, field='pernode')
1097
1101
 
@@ -1110,19 +1114,11 @@ class Schema:
1110
1114
 
1111
1115
  valstr = escape_val_tcl(value, typestr)
1112
1116
 
1113
- # Turning scalars into lists
1114
- if not (typestr.startswith('[') or typestr.startswith('(')):
1115
- valstr = f'[list {valstr}]'
1116
-
1117
- # TODO: Temp fix to get rid of empty args
1117
+ # Ensure empty values get something
1118
1118
  if valstr == '':
1119
- valstr = '[list ]'
1120
-
1121
- outstr = f"{prefix} {keystr} {valstr}"
1119
+ valstr = '{}'
1122
1120
 
1123
- # print out all non default values
1124
- if 'default' not in key:
1125
- tcl_set_cmds.append(outstr)
1121
+ tcl_set_cmds.append(f"{prefix} {keystr} {valstr}")
1126
1122
 
1127
1123
  if template:
1128
1124
  fout.write(template.render(manifest_dict='\n'.join(tcl_set_cmds),
@@ -34,7 +34,7 @@ proc sc_cfg_exists { args } {
34
34
 
35
35
  proc sc_top {} {
36
36
  set sc_entrypoint [sc_cfg_get option entrypoint]
37
- if {$sc_entrypoint == ""} {
37
+ if {$sc_entrypoint == {{ '{}' }}} {
38
38
  return [sc_cfg_get design]
39
39
  }
40
40
  return $sc_entrypoint
@@ -15,22 +15,20 @@ proc sc_collect_pin_constraints {
15
15
  set side [dict get $params side]
16
16
  set place [dict get $params placement]
17
17
 
18
- if { [llength $place] != 0 } {
18
+ if { $place != {} } {
19
19
  # Pin has placement information
20
- if { [llength $order] != 0 } {
20
+ if { $order != {} } {
21
21
  # Pin also has order information
22
22
  $print_func "Pin $name has placement specified in constraints, but also order."
23
23
  }
24
24
  lappend placement_pins $name
25
25
  } else {
26
26
  # Pin doesn't have placement
27
- if { [llength $side] == 0 || [llength $order] == 0 } {
27
+ if { $side == {} || $order == {} } {
28
28
  # Pin information is incomplete
29
29
  $print_func \
30
30
  "Warning: Pin $name doesn't have enough information to perform placement."
31
31
  } else {
32
- set side [lindex $side 0]
33
- set order [lindex $order 0]
34
32
  if { ![dict exists $pin_order $side $order] } {
35
33
  dict set pin_order $side $order []
36
34
  }
@@ -24,7 +24,7 @@ def make_docs(chip):
24
24
  def setup(chip):
25
25
  chip.set('tool', 'genfasm', 'exe', 'genfasm', clobber=False)
26
26
  chip.set('tool', 'genfasm', 'vswitch', '--version')
27
- chip.set('tool', 'genfasm', 'version', '>=8.1.0', clobber=False)
27
+ chip.set('tool', 'genfasm', 'version', '>=9.0.0', clobber=False)
28
28
 
29
29
  add_tool_requirements(chip)
30
30
 
@@ -75,6 +75,10 @@ def setup(chip):
75
75
  'if enabled by the PDK, to the design',
76
76
  skip='lib')
77
77
 
78
+ chip.set('tool', tool, 'task', task, 'var', 'debug_level',
79
+ 'list of "tool key level" to enable debugging of OpenROAD',
80
+ field='help')
81
+
78
82
  if f'{design}.v' in input_provides(chip, step, index):
79
83
  chip.add('tool', tool, 'task', task, 'input', design + '.v', step=step, index=index)
80
84
  elif f'{design}.vg' in input_provides(chip, step, index):
@@ -121,11 +121,11 @@ if { [sc_cfg_exists constraint pin] } {
121
121
  global sc_vpinmetal
122
122
 
123
123
  set layer [sc_cfg_get constraint pin $pin layer]
124
- if { [llength $layer] != 0 } {
125
- return [sc_get_layer_name [lindex $layer 0]]
124
+ if { $layer != {} } {
125
+ return [sc_get_layer_name $layer]
126
126
  }
127
127
  set side [sc_cfg_get constraint pin $pin side]
128
- if { [llength $side] != 0 } {
128
+ if { $side != {} } {
129
129
  switch -regexp $side {
130
130
  "1|3" {
131
131
  return [lindex $sc_hpinmetal 0]
@@ -35,21 +35,11 @@ set sc_threads [sc_cfg_tool_task_get threads]
35
35
  # MACROS
36
36
  set sc_macrolibs [sc_get_asic_libraries macro]
37
37
 
38
- ###############################
39
- # Suppress messages if requested
38
+ ##############################
39
+ # Setup debugging
40
40
  ###############################
41
41
 
42
- foreach msg [sc_cfg_tool_task_get warningoff] {
43
- set or_msg [split $msg "-"]
44
- if { [llength $or_msg] != 2 } {
45
- utl::warn FLW 1 "$msg is not a valid message id"
46
- } else {
47
- set or_tool [lindex $or_msg 0]
48
- set or_msg_id [expr { int([lindex $or_msg 1]) }]
49
- utl::info FLW 1 "Suppressing $msg messages"
50
- suppress_message $or_tool $or_msg_id
51
- }
52
- }
42
+ source -echo "$sc_refdir/common/debugging.tcl"
53
43
 
54
44
  ###############################
55
45
  # Source helper functions
@@ -16,6 +16,7 @@ Sources: https://github.com/verilog-to-routing/vtr-verilog-to-routing
16
16
  Installation: https://github.com/verilog-to-routing/vtr-verilog-to-routing
17
17
  '''
18
18
 
19
+ import glob
19
20
  import os
20
21
  import shutil
21
22
  import json
@@ -42,7 +43,7 @@ def setup_tool(chip, clobber=True):
42
43
 
43
44
  chip.set('tool', 'vpr', 'exe', 'vpr', clobber=clobber)
44
45
  chip.set('tool', 'vpr', 'vswitch', '--version')
45
- chip.set('tool', 'vpr', 'version', '>=8.1.0', clobber=clobber)
46
+ chip.set('tool', 'vpr', 'version', '>=9.0.0', clobber=clobber)
46
47
 
47
48
  step = chip.get('arg', 'step')
48
49
  index = chip.get('arg', 'index')
@@ -80,6 +81,16 @@ def add_tool_requirements(chip):
80
81
  chip.add('tool', tool, 'task', task, 'require', f'fpga,{part_name},var,vpr_device_code',
81
82
  step=step, index=index)
82
83
 
84
+ chip.set('tool', tool, 'task', task, 'var', 'timing_paths',
85
+ 'number of timing paths to report', field='help')
86
+ chip.set('tool', tool, 'task', task, 'var', 'timing_paths', '20',
87
+ step=step, index=index, clobber=False)
88
+
89
+ chip.set('tool', tool, 'task', task, 'var', 'timing_report_type',
90
+ 'type of timing report', field='help')
91
+ chip.set('tool', tool, 'task', task, 'var', 'timing_report_type', 'aggregated',
92
+ step=step, index=index, clobber=False)
93
+
83
94
 
84
95
  def runtime_options(chip):
85
96
 
@@ -163,13 +174,22 @@ def runtime_options(chip):
163
174
  'vpr_clock model must be set to ideal, route, or dedicated_clock_network',
164
175
  chip=chip)
165
176
 
177
+ sdc_file = None
166
178
  if chip.valid('input', 'constraint', 'sdc'):
167
179
  sdc_file = find_single_file(chip, 'input', 'constraint', 'sdc',
168
180
  step=step, index=index,
169
181
  file_not_found_msg="SDC file not found")
170
- if (sdc_file is not None):
171
- sdc_arg = f"--sdc_file {sdc_file}"
172
- options.append(sdc_arg)
182
+
183
+ if sdc_file:
184
+ sdc_arg = f"--sdc_file {sdc_file}"
185
+ options.append(sdc_arg)
186
+
187
+ report_type = chip.get('tool', tool, 'task', task, 'var', 'timing_report_type',
188
+ step=step, index=index)[0]
189
+ options.append(f'--timing_report_detail {report_type}')
190
+ report_paths = chip.get('tool', tool, 'task', task, 'var', 'timing_paths',
191
+ step=step, index=index)[0]
192
+ options.append(f'--timing_report_npaths {report_paths}')
173
193
  else:
174
194
  options.append("--timing_analysis off")
175
195
 
@@ -295,8 +315,8 @@ def vpr_post_process(chip):
295
315
  step = chip.get('arg', 'step')
296
316
  index = chip.get('arg', 'index')
297
317
 
298
- if os.path.exists('packing_pin_util.rpt'):
299
- shutil.move('packing_pin_util.rpt', 'reports')
318
+ for report in glob.glob("*.rpt"):
319
+ shutil.move(report, 'reports')
300
320
 
301
321
  part_name = chip.get('fpga', 'partname')
302
322
  dff_cells = []
@@ -379,6 +399,66 @@ def vpr_post_process(chip):
379
399
 
380
400
  record_metric(chip, step, index, "pins", io, __block_file)
381
401
 
402
+ for setup_report in ("reports/report_timing.setup.rpt",
403
+ "reports/pre_pack.report_timing.setup.rpt"):
404
+ if not os.path.exists(setup_report):
405
+ continue
406
+
407
+ slack = _parse_timing_report(setup_report)
408
+ if slack is not None:
409
+ wns = min([slack, 0])
410
+ record_metric(chip, step, index, "setupslack", slack, setup_report, source_unit="ns")
411
+ record_metric(chip, step, index, "setupwns", wns, setup_report, source_unit="ns")
412
+ break
413
+
414
+ for hold_report in ("reports/report_timing.hold.rpt", ):
415
+ if not os.path.exists(hold_report):
416
+ continue
417
+
418
+ slack = _parse_timing_report(hold_report)
419
+ if slack is not None:
420
+ wns = min([slack, 0])
421
+ record_metric(chip, step, index, "holdslack", slack, hold_report, source_unit="ns")
422
+ record_metric(chip, step, index, "holdwns", wns, hold_report, source_unit="ns")
423
+ break
424
+
425
+ unconstrained = None
426
+ unconstrained_reports = []
427
+ for unconstrained_report in ("reports/report_unconstrained_timing.hold.rpt",
428
+ "reports/report_unconstrained_timing.setup.rpt"):
429
+ if not os.path.exists(unconstrained_report):
430
+ continue
431
+
432
+ paths = _parse_unconstrained_report(unconstrained_report)
433
+ if unconstrained is None:
434
+ unconstrained = paths
435
+
436
+ unconstrained = max([paths, unconstrained])
437
+ unconstrained_reports.append(unconstrained_report)
438
+
439
+ if unconstrained is not None:
440
+ record_metric(chip, step, index, "unconstrained", unconstrained, unconstrained_reports)
441
+
442
+
443
+ def _parse_timing_report(report):
444
+ slack = re.compile(r"slack \(.*\)\s+(-?\d+\.?\d*)")
445
+ with sc_open(report) as f:
446
+ for line in f:
447
+ match_slack = slack.findall(line)
448
+ if match_slack:
449
+ return float(match_slack[0])
450
+ return None
451
+
452
+
453
+ def _parse_unconstrained_report(report):
454
+ path = re.compile(r"\d+ .*")
455
+ count = 0
456
+ with sc_open(report) as f:
457
+ for line in f:
458
+ if path.match(line):
459
+ count += 1
460
+ return count
461
+
382
462
 
383
463
  ##################################################
384
464
  if __name__ == "__main__":
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "openroad": {
3
3
  "git-url": "https://github.com/The-OpenROAD-Project/OpenROAD.git",
4
- "git-commit": "6e6fccbbe0ffbe683a51de3ecac2a24958a53fa1",
4
+ "git-commit": "1d7f91584c040b73089e415ec12fd806da1c1161",
5
5
  "docker-cmds": [
6
6
  "# Remove OR-Tools files",
7
7
  "RUN rm -f $SC_PREFIX/Makefile $SC_PREFIX/README.md",
@@ -66,7 +66,7 @@
66
66
  },
67
67
  "vpr": {
68
68
  "git-url": "https://github.com/verilog-to-routing/vtr-verilog-to-routing.git",
69
- "git-commit": "de31f094aa4f894a5e6e0dc32c66365f4b341190",
69
+ "git-commit": "v9.0.0",
70
70
  "auto-update": false
71
71
  },
72
72
  "icepack": {
@@ -139,7 +139,7 @@
139
139
  },
140
140
  "yosys-slang": {
141
141
  "git-url": "https://github.com/povik/yosys-slang.git",
142
- "git-commit": "0adba99ea43331235506b9b154c78a401f4fe9b6",
142
+ "git-commit": "8f2239b2b12dac43f8f47f56deef1095d5262fa2",
143
143
  "docker-depends": "yosys",
144
144
  "auto-update": true
145
145
  },
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: siliconcompiler
3
- Version: 0.31.0
3
+ Version: 0.31.1
4
4
  Summary: A compiler framework that automates translation from source code to silicon.
5
5
  Author-email: Andreas Olofsson <andreas.d.olofsson@gmail.com>
6
6
  License: Apache License 2.0
@@ -99,19 +99,19 @@ SiliconCompiler is a modular hardware build system ("make for silicon"). The pro
99
99
 
100
100
  | Type | Supported|
101
101
  |------|----------|
102
- |**Design Languages**| C, Verilog, SV, VHDL, Chisel, Migen/Amaranth, Bluespec
102
+ |**Design Languages**| C, Verilog, SV, VHDL, Chisel, Migen/Amaranth, Bluespec, [MLIR](https://en.wikipedia.org/wiki/MLIR_(software))
103
103
  |**Simulation Tools**| Verilator, Icarus, GHDL, Xyce
104
104
  |**Synthesis**| Yosys, Vivado, Synopsys, Cadence
105
- |**ASIC APR**| OpenRoad, Synopsys, Cadence
105
+ |**ASIC APR**| OpenROAD, Synopsys, Cadence
106
106
  |**FPGA APR**| VPR, nextpnr, Vivado
107
- |**Layout Viewer**| Klayout, OpenRoad, Cadence, Synopsys
108
- |**DRC/LVS**| Magic, Synopsys, Siemens
109
- |**PDKs**| sky130, gf180, asap7, freepdk45, gf12lp, gf22fdx, intel16, ihp130
107
+ |**Layout Viewer**| Klayout, OpenROAD, Cadence, Synopsys
108
+ |**DRC/LVS**| Klayout, Magic, Synopsys, Siemens
109
+ |**PDKs**| sky130, ihp130, gf180, asap7, freepdk45, gf12lp, gf22fdx, intel16
110
110
 
111
111
  # Getting Started
112
112
 
113
113
  SiliconCompiler is available as wheel packages on PyPI for macOS, Windows and
114
- Linux platforms. For working Python 3.8-3.12 environment, just use pip.
114
+ Linux platforms. For working Python 3.8-3.13 environment, just use pip.
115
115
 
116
116
  ```sh
117
117
  python3 -m pip install --upgrade siliconcompiler
@@ -166,17 +166,15 @@ A. Olofsson, W. Ransohoff, N. Moroze, "[Invited: A Distributed Approach to Silic
166
166
  Bibtex:
167
167
  ```
168
168
  @inproceedings{10.1145/3489517.3530673,
169
- author = {Olofsson, Andreas and Ransohoff, William and Moroze, Noah},
170
- title = {A Distributed Approach to Silicon Compilation: Invited},
171
- year = {2022},
172
- booktitle = {Proceedings of the 59th ACM/IEEE Design Automation Conference},
173
- pages = {1343–1346},
174
- location = {San Francisco, California}
169
+ author = {Olofsson, Andreas and Ransohoff, William and Moroze, Noah},
170
+ title = {A Distributed Approach to Silicon Compilation: Invited},
171
+ year = {2022},
172
+ booktitle = {Proceedings of the 59th ACM/IEEE Design Automation Conference},
173
+ pages = {1343–1346},
174
+ location = {San Francisco, California}
175
175
  }
176
176
  ```
177
177
 
178
-
179
-
180
178
  # Installation
181
179
 
182
180
  Complete installation instructions are available in the [Installation Guide](https://docs.siliconcompiler.com/en/stable/user_guide/installation.html).
@@ -194,14 +192,14 @@ python3 -m pip install -e .[docs,test] # Optional install step for generating d
194
192
 
195
193
  Installation instructions for all external tools can be found in the
196
194
  [External Tools](https://docs.siliconcompiler.com/en/stable/user_guide/installation.html#external-tools) section
197
- of the user guide. We have included shell setup scripts (Ubuntu) for most of the supported tools.
195
+ of the user guide. We have included shell setup scripts (Ubuntu) for most of the supported tools, which can be accessed via [sc-install](https://docs.siliconcompiler.com/en/latest/reference_manual/apps.html#apps-sc-install-ref).
198
196
  See the [./siliconcompiler/toolscripts](./siliconcompiler/toolscripts) directory for a complete set of scripts and [./siliconcompiler/toolscripts/_tools.json](./siliconcompiler/toolscripts/_tools.json) for the currently recommended tool versions.
199
197
 
200
198
  # Contributing
201
199
 
202
200
  SiliconCompiler is an open-source project and welcomes contributions. To find out
203
201
  how to contribute to the project, see our
204
- [Contributing Guidelines.](./CONTRIBUTING.md)
202
+ [Contributing Guidelines](./CONTRIBUTING.md).
205
203
 
206
204
  # Issues / Bugs
207
205
 
@@ -1,18 +1,17 @@
1
1
  siliconcompiler/__init__.py,sha256=Ke_Bcryj9N6MoUq_5z_IDW3qMrUzR-3-kJVsvUenYzY,511
2
2
  siliconcompiler/__main__.py,sha256=JwWkcvaNngqgMWprEQ1cFy2Wdq9GMvk46UGTHyh_qvM,170
3
3
  siliconcompiler/_common.py,sha256=c6r0SbI2xTpNOZayFsyCDo0riJGNJSPN-0zW8R7rDBI,1488
4
- siliconcompiler/_metadata.py,sha256=jCk7lB0BP8YDprLuf_4ZDvPTCIZ7fKMgczTWTb2Foyw,1264
5
- siliconcompiler/core.py,sha256=qOJukvP4UxT4NJ_lKQDnAPNey0orJ3QTMNuB-f15Urs,139775
4
+ siliconcompiler/_metadata.py,sha256=i_Lo3T11LBCBNlSyyLdOKcVrSbKRGv-UmYl4l1ROY4w,1264
5
+ siliconcompiler/core.py,sha256=CA7SEpDkVHucYaD8c8tctObqtep3cEcasJN1SmESMxg,139774
6
6
  siliconcompiler/flowgraph.py,sha256=Z_c4DEh1JvHE_u0O2M2Y1_dn6aGOAECX-HzrIjn0ky4,22084
7
7
  siliconcompiler/issue.py,sha256=9ZpdEBh8QB56-bZ1YXRnjqgg9hwnFty2u1o5oI66W7M,11125
8
- siliconcompiler/package.py,sha256=RvFbX51o77j0fwNdFueKwsO-lqWWJsjzjFSdUGZd-jU,14123
9
8
  siliconcompiler/units.py,sha256=SHQWTKuiaYHqqTbhspsED0gw-4Lb7f5VKunWy9dhS3s,5810
10
9
  siliconcompiler/use.py,sha256=t5TodYt9tkYjNIdB6Ak-P3Gf2dgpX9Q-WXGBTLtVdQo,6058
11
10
  siliconcompiler/apps/__init__.py,sha256=6LuAljPtVB6g5yXl_58ODoB4Svb6UfKaDbX1e0aNZfE,668
12
11
  siliconcompiler/apps/_common.py,sha256=Ph-cD-t9lCzavak3s4YCXXmA_ouf-jJ-7WIEGkSsjOg,3770
13
12
  siliconcompiler/apps/sc.py,sha256=DAhhyfpHEN0mDmQ3YcFWpGk7R64OEpguZ2QCEFGxyr4,3235
14
13
  siliconcompiler/apps/sc_dashboard.py,sha256=kGyMYbgKgZMBUrTyft6mEvRnmcrKA7JunrkWZ8VwSwM,3478
15
- siliconcompiler/apps/sc_install.py,sha256=duwi5ypm1V9K0xbhzNXzaYF7kZWNXuQcvMi0ZEM2h8M,8104
14
+ siliconcompiler/apps/sc_install.py,sha256=qz6Dni7HcYrl9V7mDk2hqMYY4BwqRceNb-Gd2UE5zzk,8569
16
15
  siliconcompiler/apps/sc_issue.py,sha256=PUXFWne6MWY0Ntak3PnMZ84tpEZ5S1Pta5B3AkxMdoY,6404
17
16
  siliconcompiler/apps/sc_remote.py,sha256=vMdh9LdFJ-0vFzYMFttcERXCFwzNMmAQyXPIxoNCmhg,7168
18
17
  siliconcompiler/apps/sc_server.py,sha256=d3SCfKtNneIBiAk7Udc5SqXvSIoFSK40iHWcKuY7unk,894
@@ -48,6 +47,9 @@ siliconcompiler/fpgas/vpr_example.py,sha256=xcTgCvxSadcBnYVrglAi5XM4nn_raXWFvr_o
48
47
  siliconcompiler/libs/__init__.py,sha256=KXw1vU0KP83fg3rB8iKkpDhJZBLz_PWGZG65L3lAQ1Q,86
49
48
  siliconcompiler/optimizer/__init__.py,sha256=wdSuv3U7hoSdZn-TkaQtYehVdhS5F35Mb1McgaUw3hc,6599
50
49
  siliconcompiler/optimizer/vizier.py,sha256=-JF3E28SLhfkjluz2R5dFnjg5NjU1z7Okb-K_ZK9H3s,9035
50
+ siliconcompiler/package/__init__.py,sha256=Dg_GBWERdCGRPjBNxcUHBB8Zf2ns-PgLy2Xqo0tARVw,9054
51
+ siliconcompiler/package/git.py,sha256=L6J7H8s8LNdhrhlhuEw0eU4nHx7o6iOIjIf91OcmX80,3200
52
+ siliconcompiler/package/https.py,sha256=8jXjNUA21p4fMW9WVbystk_HZTc0KgUUiIwfq-ziuk0,2919
51
53
  siliconcompiler/pdks/__init__.py,sha256=bWhtNR-Kq3fEyknon-x5vQX877b88g9EJXAHBMiDyGM,81
52
54
  siliconcompiler/remote/__init__.py,sha256=MoYnC1lkgbT5hN5Qi-0gTItaTWI2U1E8OuleffdTDSQ,977
53
55
  siliconcompiler/remote/client.py,sha256=qwZaKSt-ScYjfBFpL9Np9Z0nDytYRJHgvNJnrXHGhok,32848
@@ -87,16 +89,16 @@ siliconcompiler/report/dashboard/layouts/vertical_flowgraph_node_tab.py,sha256=0
87
89
  siliconcompiler/report/dashboard/layouts/vertical_flowgraph_sac_tabs.py,sha256=g6lrnXJVEkTh7OQY1xCgl_q0So0XewItuY0sjnjaBCA,4086
88
90
  siliconcompiler/report/dashboard/utils/__init__.py,sha256=mkcBAlfPovfgoRv9nPbtgQSeFglwlxlSIXsEQmdsDz8,2540
89
91
  siliconcompiler/report/dashboard/utils/file_utils.py,sha256=5MKAyf7TGXQIc3yxwbP1H6xi0NGwUfzu2j3LOv1Yei0,3333
90
- siliconcompiler/scheduler/__init__.py,sha256=6g_z6_2hd9FPNJ4kizzIY8u-9RdfSxMXQbewTYnRNY8,87167
91
- siliconcompiler/scheduler/docker_runner.py,sha256=VAyzVsVClOVD5-DY9zgRLl8O0ZBuwbeI3wf8SmEGk8E,8065
92
- siliconcompiler/scheduler/run_node.py,sha256=IWodOtT6b_MO5oXpEiF0th1Q3v7AD66jE182lY-aGv4,5063
92
+ siliconcompiler/scheduler/__init__.py,sha256=goiNHGe41JjCKoMWIh6i3fcw9kuC7lXcAziA_bFeun4,87291
93
+ siliconcompiler/scheduler/docker_runner.py,sha256=zeAPHgthkoR8ATY6zmV2kCJWpD13fuq2DCzzG66Ubm8,8052
94
+ siliconcompiler/scheduler/run_node.py,sha256=XEY3SNIstK8SLnD7uiHmQ_9maCgdfTECQAJr5OT9rQI,5036
93
95
  siliconcompiler/scheduler/send_messages.py,sha256=mWmkfPVDEfzOawVq6At6fi0JgFkzyFNwAA29lYkN5Xw,6618
94
96
  siliconcompiler/scheduler/slurm.py,sha256=CAuN5xmiWhk_k3CW6yMe5iukex4CWxp5Ox6_qAzgV5Q,7097
95
97
  siliconcompiler/scheduler/validation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
98
  siliconcompiler/scheduler/validation/email_credentials.json,sha256=hkJs0U2h2Bgm1zxeXvanIJ-prPhpn_aU6e3qwIs7qA0,1997
97
99
  siliconcompiler/schema/__init__.py,sha256=Gdny2AwDdg-X3RvghOHQYl3aG2alvMuK5CsSkFGKuYU,120
98
100
  siliconcompiler/schema/schema_cfg.py,sha256=oHE1hEgLFgU2r4sValymY_-84SCchU_6j0BGkXFwdjw,188876
99
- siliconcompiler/schema/schema_obj.py,sha256=Q8FOuZ1FFNhXszTX8vV-L_BXtV30L8U8CFzESScqDJ0,76339
101
+ siliconcompiler/schema/schema_obj.py,sha256=BHMr00Et57iukxTI9hiJUHkhAw1LRbsWJcDCejeCBDg,76158
100
102
  siliconcompiler/schema/utils.py,sha256=qeAICnQuuzrcJSyotFGWA6gmunpu63AOaEtuhIcBi5c,4504
101
103
  siliconcompiler/sphinx_ext/__init__.py,sha256=nXMFqWewqjy8FZbExAp2wtVu8EmZ3cXKvomlpxnzKUE,1859
102
104
  siliconcompiler/sphinx_ext/dynamicgen.py,sha256=QwrigvFqj900Sud4qICNlKYAxqLQOxSvzqRKwNAz02o,34575
@@ -130,7 +132,7 @@ siliconcompiler/templates/report/sc_report.j2,sha256=azDmB57TVt_g0-lYchp3OVca1JL
130
132
  siliconcompiler/templates/slurm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
133
  siliconcompiler/templates/slurm/run.sh,sha256=uXs91H0vjLB8G8vaezxXSr3XNR2EUiXH1dyfOSHYYnk,214
132
134
  siliconcompiler/templates/tcl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
133
- siliconcompiler/templates/tcl/manifest.tcl.j2,sha256=XT2pKuPSaa2GPJj1IpEl3Al5N70yqQS8jZecmpyeV4o,3547
135
+ siliconcompiler/templates/tcl/manifest.tcl.j2,sha256=mwH-deAUkYN3zOKS7g8l2R53nl2PnqR4EVaOQG5D-h0,3555
134
136
  siliconcompiler/tools/__init__.py,sha256=dulw1XiU58QYllrHuQU3hZOKyO4Hm_AQ-brSC9ZD5OY,1929
135
137
  siliconcompiler/tools/_common/__init__.py,sha256=erec5qPEXVJInHXT5fKbLDytQXx2y0-W6QmefKLeQ-8,15194
136
138
  siliconcompiler/tools/_common/asic.py,sha256=1pLODTy0fznHh3D9LpidWOz-MtqY4MouSFJUoP0uAV0,9084
@@ -138,7 +140,7 @@ siliconcompiler/tools/_common/asic_clock.py,sha256=JSd4Ne0TxISqcZGICNLQCVfPNdUYv
138
140
  siliconcompiler/tools/_common/sdc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
141
  siliconcompiler/tools/_common/sdc/sc_constraints.sdc,sha256=Hz6OLebi14UTcfGXgJoNJeFo0BH_4N5XwjFe2mrey8g,2827
140
142
  siliconcompiler/tools/_common/tcl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
- siliconcompiler/tools/_common/tcl/sc_pin_constraints.tcl,sha256=Q6L9hd3rP2h71dGoxWDAYyHSfgeja2JqNJpQhfvJGYw,2102
143
+ siliconcompiler/tools/_common/tcl/sc_pin_constraints.tcl,sha256=PDuriCKS_jv6UkwWFL1EAhx5dew8tiwsqR4IPx6vhKM,1980
142
144
  siliconcompiler/tools/bambu/__init__.py,sha256=hodIBmILSE7xvfIc74r0Qc0dZI42TwHhrKmWLom-hc0,1159
143
145
  siliconcompiler/tools/bambu/convert.py,sha256=issKBrrQBs4aLxN-7F8xPNwKlDD4Kk-TxORFDCVNKPs,6026
144
146
  siliconcompiler/tools/bluespec/__init__.py,sha256=A9LGMUG7fconBkkeVRr_cXOpKQcib2Isc8hta0SJues,1150
@@ -163,7 +165,7 @@ siliconcompiler/tools/execute/exec_input.py,sha256=oYI4kfVxKN3RhFv2gg1uWW59Tqm5e
163
165
  siliconcompiler/tools/execute/execute.py,sha256=hzppu1rpNMNkqQK2KnuoIkjHzA2sijQO_QHzXeLdlZQ,525
164
166
  siliconcompiler/tools/genfasm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
167
  siliconcompiler/tools/genfasm/bitstream.py,sha256=SNrilNrB5HiibBbsdK_J1CUaiq-DKJgLaSnvij081ig,1910
166
- siliconcompiler/tools/genfasm/genfasm.py,sha256=ysiFWhfoZ6F551dnE4BTgdbG7VHdCxwIAl_yjdiKGk8,1432
168
+ siliconcompiler/tools/genfasm/genfasm.py,sha256=nHRSwL8JNDxMBYvr5nadJ0lXjdPq_o3X5eAdrZuiQps,1432
167
169
  siliconcompiler/tools/ghdl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
168
170
  siliconcompiler/tools/ghdl/convert.py,sha256=OXwohmi30_4Bb_XiMFodKRVFL6W1V_H21ilEW0eHRtM,3008
169
171
  siliconcompiler/tools/ghdl/ghdl.py,sha256=E0YJtb6ounqnW34hpz_bpLCIeNFxF429DJMHswMs4xE,1186
@@ -228,14 +230,14 @@ siliconcompiler/tools/openroad/pin_placement.py,sha256=zuqqlsDJx9K_CvAsc8GkJP1yN
228
230
  siliconcompiler/tools/openroad/power_grid.py,sha256=CRoa1UEd3W8oJerT29zl1pRtz804IcNS_6sEAdQrfiM,2469
229
231
  siliconcompiler/tools/openroad/rcx_bench.py,sha256=6ASma7QGgM4Hk5oXYdDAR1BgElxhYN9L7RoDbQi9LBE,3655
230
232
  siliconcompiler/tools/openroad/rcx_extract.py,sha256=ANj46BR3bzlTlI-wl45hD0HODTGRd03SfsM7gnEDJsg,1338
231
- siliconcompiler/tools/openroad/rdlroute.py,sha256=xocIuor51xUHSvWFBwpqT9crC-nMShqaPEx5U1QoA48,3798
233
+ siliconcompiler/tools/openroad/rdlroute.py,sha256=NNdqYYZRC9HMi_SkWMLPK-oTzv1bkXE8g14rHLKPUU8,3962
232
234
  siliconcompiler/tools/openroad/repair_design.py,sha256=Fty-8NUgt5VwxReVoDQj6KE3UWoj-Sc9F-8BDBIcybk,1596
233
235
  siliconcompiler/tools/openroad/repair_timing.py,sha256=1OwwLdhErWOyNNZBwcD02mMhBWRqbAQk6WUJc_NYpfI,1665
234
236
  siliconcompiler/tools/openroad/screenshot.py,sha256=76IEYFy2CkmvCRbRYND1H-xhF0Jgjmu96HgQE6ttZV4,1574
235
237
  siliconcompiler/tools/openroad/show.py,sha256=fABmvb9Y3bRwgvTorQR4w25ioCoLROvM0_VQlOTBap8,3874
236
238
  siliconcompiler/tools/openroad/write_data.py,sha256=-COViTockYNz6ik77dHy22GC0XrRIplnp-fOHHHhHUQ,5297
237
239
  siliconcompiler/tools/openroad/scripts/sc_rcx.tcl,sha256=eLbIVoKo9RgxZUcVAmkVMylxDUi7kSeIF1x518c_cZA,1254
238
- siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl,sha256=5levTU6FUwtURW_UfSfdki2zWnr15-5ixkhbNPE3rYw,4992
240
+ siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl,sha256=_DLf65pt0A9slReRWnANVme0Djb2C6XYN6f5SiCdezk,4636
239
241
  siliconcompiler/tools/openroad/scripts/sc_show.tcl,sha256=JYgw9nRMqP-LzvS9ZAM-JzEy6XPvPvgPKDrPPm1WEoE,2657
240
242
  siliconcompiler/tools/openroad/scripts/apr/postamble.tcl,sha256=9CLpG_DLvRKMgFRQMR5xWSzGIF9QERIBMkKTxcDYaWA,1130
241
243
  siliconcompiler/tools/openroad/scripts/apr/preamble.tcl,sha256=K_ChMVU0Rs3bbB_xKsekw7XBPa-nHVrT9_Nqumbxm3s,2625
@@ -248,7 +250,7 @@ siliconcompiler/tools/openroad/scripts/apr/sc_fillercell_insertion.tcl,sha256=uc
248
250
  siliconcompiler/tools/openroad/scripts/apr/sc_fillmetal_insertion.tcl,sha256=Qk16mhbcVo1g4wBKjYwV4aNr2zAEFXsF8XnehA9xbWY,896
249
251
  siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl,sha256=I36F4XY0beyrf58HM0cwsPvTzI7kYV1lAdr7ENHrEb4,2608
250
252
  siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl,sha256=oeA0DUEWQa0iq_LIivUH0z8InIP_pdvg8gRf71G62GQ,2252
251
- siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl,sha256=opvE_hbM6bXsKoTFE52ET_6DSw4WSowiTBcZvI-nk_E,10496
253
+ siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl,sha256=uFJMPuANpbF_V871vdf1AOS6YdXc5Q1glIV8qc51QiU,10467
252
254
  siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl,sha256=R8n5YNADrKZkLRnjdvPLISDtvkgJ1eSbhp8v05ypjiY,4774
253
255
  siliconcompiler/tools/openroad/scripts/apr/sc_metrics.tcl,sha256=Y3EtUBTT1XJIM6CgnXqGAoRg46GNYuMG3dJ6tw-2ShE,500
254
256
  siliconcompiler/tools/openroad/scripts/apr/sc_pin_placement.tcl,sha256=FpHZ7b88rH-sxlg0w9PpWrmAZIj3Q6yLNiEFFm9wzkw,1114
@@ -316,7 +318,7 @@ siliconcompiler/tools/vpr/place.py,sha256=A3yIngDtMIhx8MqgLefLAzONneXlYpb_yuzUYT
316
318
  siliconcompiler/tools/vpr/route.py,sha256=k4B5ZZuLov0_t-z3jlfp9tfxMzszozOtKLwqpa4lRss,4907
317
319
  siliconcompiler/tools/vpr/screenshot.py,sha256=5Ji6J9p0R0C7C9WkuCwLu2InGQpeCo_Ciif7wUXz9ng,1818
318
320
  siliconcompiler/tools/vpr/show.py,sha256=u6YNdtH6CL7C49CJqglGuS7r6HbftCQPK6wN4MmaIQ8,3161
319
- siliconcompiler/tools/vpr/vpr.py,sha256=tg6D_RqZXB7aRGnQInV01v92qnSFTwA7-3vB1x88s54,14641
321
+ siliconcompiler/tools/vpr/vpr.py,sha256=8rD3AzjafPdPmX8zCm2rYSHDdTYiIKZe33SoDgsMO0o,17696
320
322
  siliconcompiler/tools/xdm/__init__.py,sha256=uEo7uTPRdoARmk0E5U8yQ_MZOntO-cWJfGb6_pPA0ZQ,729
321
323
  siliconcompiler/tools/xdm/convert.py,sha256=rlirszWfNs2x9KApd3AiKpx78B3bfQ5VVWv5Nk_LSuU,2371
322
324
  siliconcompiler/tools/xyce/__init__.py,sha256=YTSk-XGtviqthGmGHb6RCDEAIMUQ7ElYZjZzpa1aSBg,1297
@@ -338,7 +340,7 @@ siliconcompiler/tools/yosys/techmaps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
338
340
  siliconcompiler/tools/yosys/techmaps/lcu_kogge_stone.v,sha256=M4T-ygiKmlsprl5eGGLaV5w6HVqlEepn0wlUDmOkapg,773
339
341
  siliconcompiler/tools/yosys/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
340
342
  siliconcompiler/tools/yosys/templates/abc.const,sha256=TAq9ThdLMYCJGrtToEU0gWcLuEtjE4Gk8huBbTm1v-I,116
341
- siliconcompiler/toolscripts/_tools.json,sha256=arJyD3ThQSrDf28IeUSeqV9fhz1xzRbq4OS2J9wTR-0,4437
343
+ siliconcompiler/toolscripts/_tools.json,sha256=EKdv-EQ_xdD3AacY73aM4sr39gtDY71zOcffQOriQ44,4403
342
344
  siliconcompiler/toolscripts/_tools.py,sha256=P30KY_xbbjl8eHGsPAxDcAzWvJJpiL07ZfGZZDQbdR8,7174
343
345
  siliconcompiler/toolscripts/rhel8/install-chisel.sh,sha256=lPORZN7vlBX6sJSv01JOIiDE9-_7GcCZGA7EP5ri3MQ,525
344
346
  siliconcompiler/toolscripts/rhel8/install-ghdl.sh,sha256=xCLeEUuJVI_6PVEvnTwBsTWoEHiQg0TY3x-tJXfg6Zk,459
@@ -454,9 +456,9 @@ siliconcompiler/utils/__init__.py,sha256=y4S1sRW2C3oYXN6PMZOHFO8-ytQ8yJvUoQtqKln
454
456
  siliconcompiler/utils/asic.py,sha256=cMLs7dneSmh5BlHS0-bZ1tLUpvghTw__gNaUCMpyBds,4986
455
457
  siliconcompiler/utils/logging.py,sha256=5tabLIVEftStGDeDulhfBdw4SFp5nHa4J3ZTJKHny8Q,2325
456
458
  siliconcompiler/utils/showtools.py,sha256=gaAvjMTFlx_0qLKOtpRJx8Bs51TEeQ-4Pjj8kHfFf3o,1871
457
- siliconcompiler-0.31.0.dist-info/LICENSE,sha256=lbLR6sRo_CYJOf7SVgHi-U6CZdD8esESEZE5TZazOQE,10766
458
- siliconcompiler-0.31.0.dist-info/METADATA,sha256=GQL9pDyXtimoItoCWY0CAUnXqkuAU8jxirT7NChqPoc,11257
459
- siliconcompiler-0.31.0.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
460
- siliconcompiler-0.31.0.dist-info/entry_points.txt,sha256=asA4fgXLVcZtdoZ16bL4z8t229gnA6MxO_cFFlaBtGs,947
461
- siliconcompiler-0.31.0.dist-info/top_level.txt,sha256=H8TOYhnEUZAV1RJTa8JRtjLIebwHzkQUhA2wkNU2O6M,16
462
- siliconcompiler-0.31.0.dist-info/RECORD,,
459
+ siliconcompiler-0.31.1.dist-info/LICENSE,sha256=lbLR6sRo_CYJOf7SVgHi-U6CZdD8esESEZE5TZazOQE,10766
460
+ siliconcompiler-0.31.1.dist-info/METADATA,sha256=cHiZiRkjqUahZpw7pq-Sxrfr-mVrbVgiIG71F0swDjo,11462
461
+ siliconcompiler-0.31.1.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
462
+ siliconcompiler-0.31.1.dist-info/entry_points.txt,sha256=69hHdWZQBugdza9dYdxodDySxmq6TgwpRYMeH2KfD4Q,1078
463
+ siliconcompiler-0.31.1.dist-info/top_level.txt,sha256=H8TOYhnEUZAV1RJTa8JRtjLIebwHzkQUhA2wkNU2O6M,16
464
+ siliconcompiler-0.31.1.dist-info/RECORD,,
@@ -19,6 +19,10 @@ pdks = siliconcompiler.sphinx_ext:pdks
19
19
  targets = siliconcompiler.sphinx_ext:targets
20
20
  tools = siliconcompiler.sphinx_ext:tools
21
21
 
22
+ [siliconcompiler.path_resolver]
23
+ git = siliconcompiler.package.git:get_resolver
24
+ https = siliconcompiler.package.https:get_resolver
25
+
22
26
  [siliconcompiler.show]
23
27
  scsetup = siliconcompiler.utils.showtools:setup
24
28