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.
- siliconcompiler/_metadata.py +1 -1
- siliconcompiler/apps/sc_install.py +19 -1
- siliconcompiler/core.py +1 -1
- siliconcompiler/{package.py → package/__init__.py} +62 -176
- siliconcompiler/package/git.py +81 -0
- siliconcompiler/package/https.py +93 -0
- siliconcompiler/scheduler/__init__.py +19 -10
- siliconcompiler/scheduler/docker_runner.py +3 -3
- siliconcompiler/scheduler/run_node.py +3 -3
- siliconcompiler/schema/schema_obj.py +7 -11
- siliconcompiler/templates/tcl/manifest.tcl.j2 +1 -1
- siliconcompiler/tools/_common/tcl/sc_pin_constraints.tcl +3 -5
- siliconcompiler/tools/genfasm/genfasm.py +1 -1
- siliconcompiler/tools/openroad/rdlroute.py +4 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +3 -3
- siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +3 -13
- siliconcompiler/tools/vpr/vpr.py +86 -6
- siliconcompiler/toolscripts/_tools.json +3 -3
- {siliconcompiler-0.31.0.dist-info → siliconcompiler-0.31.1.dist-info}/METADATA +15 -17
- {siliconcompiler-0.31.0.dist-info → siliconcompiler-0.31.1.dist-info}/RECORD +24 -22
- {siliconcompiler-0.31.0.dist-info → siliconcompiler-0.31.1.dist-info}/entry_points.txt +4 -0
- {siliconcompiler-0.31.0.dist-info → siliconcompiler-0.31.1.dist-info}/LICENSE +0 -0
- {siliconcompiler-0.31.0.dist-info → siliconcompiler-0.31.1.dist-info}/WHEEL +0 -0
- {siliconcompiler-0.31.0.dist-info → siliconcompiler-0.31.1.dist-info}/top_level.txt +0 -0
siliconcompiler/_metadata.py
CHANGED
|
@@ -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.
|
|
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
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
92
|
-
|
|
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
|
-
|
|
106
|
-
|
|
100
|
+
if package not in chip._packages:
|
|
101
|
+
changed = False
|
|
102
|
+
data_path = _path(chip, package)
|
|
107
103
|
|
|
108
|
-
|
|
109
|
-
|
|
104
|
+
if isinstance(data_path, tuple) and len(data_path) == 2:
|
|
105
|
+
data_path, changed = data_path
|
|
110
106
|
|
|
111
|
-
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
1922
|
-
required.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
106
|
+
# Populate cache
|
|
107
107
|
for package in chip.getkeys('package', 'source'):
|
|
108
|
-
sc_path(chip, package
|
|
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
|
-
#
|
|
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 = '
|
|
1120
|
-
|
|
1121
|
-
outstr = f"{prefix} {keystr} {valstr}"
|
|
1119
|
+
valstr = '{}'
|
|
1122
1120
|
|
|
1123
|
-
|
|
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),
|
|
@@ -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 {
|
|
18
|
+
if { $place != {} } {
|
|
19
19
|
# Pin has placement information
|
|
20
|
-
if {
|
|
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 {
|
|
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', '>=
|
|
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 {
|
|
125
|
-
return [sc_get_layer_name
|
|
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 {
|
|
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
|
-
#
|
|
38
|
+
##############################
|
|
39
|
+
# Setup debugging
|
|
40
40
|
###############################
|
|
41
41
|
|
|
42
|
-
|
|
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
|
siliconcompiler/tools/vpr/vpr.py
CHANGED
|
@@ -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', '>=
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
299
|
-
shutil.move(
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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.
|
|
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**|
|
|
105
|
+
|**ASIC APR**| OpenROAD, Synopsys, Cadence
|
|
106
106
|
|**FPGA APR**| VPR, nextpnr, Vivado
|
|
107
|
-
|**Layout Viewer**| Klayout,
|
|
108
|
-
|**DRC/LVS**| Magic, Synopsys, Siemens
|
|
109
|
-
|**PDKs**| sky130, gf180, asap7, freepdk45, gf12lp, gf22fdx, intel16
|
|
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.
|
|
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
|
|
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=
|
|
5
|
-
siliconcompiler/core.py,sha256=
|
|
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=
|
|
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=
|
|
91
|
-
siliconcompiler/scheduler/docker_runner.py,sha256=
|
|
92
|
-
siliconcompiler/scheduler/run_node.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
458
|
-
siliconcompiler-0.31.
|
|
459
|
-
siliconcompiler-0.31.
|
|
460
|
-
siliconcompiler-0.31.
|
|
461
|
-
siliconcompiler-0.31.
|
|
462
|
-
siliconcompiler-0.31.
|
|
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
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|