siliconcompiler 0.28.3__py3-none-any.whl → 0.28.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. siliconcompiler/_metadata.py +1 -1
  2. siliconcompiler/apps/sc_dashboard.py +1 -1
  3. siliconcompiler/core.py +93 -55
  4. siliconcompiler/fpgas/vpr_example.py +8 -0
  5. siliconcompiler/package.py +3 -2
  6. siliconcompiler/report/dashboard/__init__.py +9 -0
  7. siliconcompiler/report/dashboard/components/__init__.py +13 -1
  8. siliconcompiler/report/dashboard/layouts/vertical_flowgraph.py +4 -3
  9. siliconcompiler/report/dashboard/layouts/vertical_flowgraph_node_tab.py +4 -1
  10. siliconcompiler/report/dashboard/layouts/vertical_flowgraph_sac_tabs.py +4 -1
  11. siliconcompiler/report/dashboard/state.py +3 -1
  12. siliconcompiler/report/summary_table.py +1 -2
  13. siliconcompiler/report/utils.py +1 -2
  14. siliconcompiler/scheduler/__init__.py +2 -0
  15. siliconcompiler/sphinx_ext/dynamicgen.py +6 -0
  16. siliconcompiler/tools/_common/__init__.py +44 -6
  17. siliconcompiler/tools/_common/asic.py +79 -23
  18. siliconcompiler/tools/genfasm/genfasm.py +7 -0
  19. siliconcompiler/tools/ghdl/convert.py +7 -0
  20. siliconcompiler/tools/klayout/convert_drc_db.py +60 -0
  21. siliconcompiler/tools/klayout/drc.py +156 -0
  22. siliconcompiler/tools/klayout/export.py +2 -0
  23. siliconcompiler/tools/klayout/klayout.py +0 -1
  24. siliconcompiler/tools/klayout/klayout_convert_drc_db.py +182 -0
  25. siliconcompiler/tools/klayout/operations.py +2 -0
  26. siliconcompiler/tools/klayout/screenshot.py +2 -0
  27. siliconcompiler/tools/klayout/show.py +4 -4
  28. siliconcompiler/tools/magic/drc.py +21 -0
  29. siliconcompiler/tools/magic/extspice.py +21 -0
  30. siliconcompiler/tools/magic/magic.py +29 -0
  31. siliconcompiler/tools/magic/sc_drc.tcl +2 -12
  32. siliconcompiler/tools/magic/sc_extspice.tcl +3 -15
  33. siliconcompiler/tools/openroad/openroad.py +44 -2
  34. siliconcompiler/tools/openroad/scripts/sc_apr.tcl +15 -0
  35. siliconcompiler/tools/openroad/scripts/sc_floorplan.tcl +55 -9
  36. siliconcompiler/tools/openroad/scripts/sc_metrics.tcl +10 -0
  37. siliconcompiler/tools/openroad/scripts/sc_procs.tcl +3 -1
  38. siliconcompiler/tools/openroad/scripts/sc_route.tcl +8 -2
  39. siliconcompiler/tools/openroad/scripts/sc_screenshot.tcl +0 -5
  40. siliconcompiler/tools/openroad/scripts/sc_write_images.tcl +36 -6
  41. siliconcompiler/tools/surelog/__init__.py +12 -0
  42. siliconcompiler/tools/verilator/compile.py +27 -0
  43. siliconcompiler/tools/verilator/verilator.py +9 -0
  44. siliconcompiler/tools/vpr/vpr.py +18 -0
  45. siliconcompiler/tools/yosys/{syn_asic_fpga_shared.tcl → procs.tcl} +23 -0
  46. siliconcompiler/tools/yosys/sc_screenshot.tcl +104 -0
  47. siliconcompiler/tools/yosys/sc_syn.tcl +7 -9
  48. siliconcompiler/tools/yosys/screenshot.py +153 -0
  49. siliconcompiler/tools/yosys/syn_asic.py +3 -0
  50. siliconcompiler/tools/yosys/syn_asic.tcl +1 -3
  51. siliconcompiler/tools/yosys/syn_fpga.tcl +3 -2
  52. siliconcompiler/toolscripts/_tools.json +3 -3
  53. siliconcompiler/utils/__init__.py +30 -1
  54. siliconcompiler/utils/showtools.py +4 -0
  55. {siliconcompiler-0.28.3.dist-info → siliconcompiler-0.28.4.dist-info}/METADATA +16 -3
  56. {siliconcompiler-0.28.3.dist-info → siliconcompiler-0.28.4.dist-info}/RECORD +60 -55
  57. {siliconcompiler-0.28.3.dist-info → siliconcompiler-0.28.4.dist-info}/WHEEL +1 -1
  58. {siliconcompiler-0.28.3.dist-info → siliconcompiler-0.28.4.dist-info}/LICENSE +0 -0
  59. {siliconcompiler-0.28.3.dist-info → siliconcompiler-0.28.4.dist-info}/entry_points.txt +0 -0
  60. {siliconcompiler-0.28.3.dist-info → siliconcompiler-0.28.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,104 @@
1
+ ###############################
2
+ # Reading SC Schema
3
+ ###############################
4
+
5
+ source ./sc_manifest.tcl
6
+
7
+ yosys echo on
8
+
9
+ ###############################
10
+ # Schema Adapter
11
+ ###############################
12
+
13
+ set sc_tool yosys
14
+ set sc_step [sc_cfg_get arg step]
15
+ set sc_index [sc_cfg_get arg index]
16
+ set sc_flow [sc_cfg_get option flow]
17
+ set sc_task [sc_cfg_get flowgraph $sc_flow $sc_step $sc_index task]
18
+ set sc_refdir [sc_cfg_tool_task_get refdir]
19
+
20
+ ####################
21
+ # DESIGNER's CHOICE
22
+ ####################
23
+
24
+ set sc_design [sc_top]
25
+
26
+ ########################################################
27
+ # Helper function
28
+ ########################################################
29
+
30
+ source "$sc_refdir/procs.tcl"
31
+
32
+ ########################################################
33
+ # Design Inputs
34
+ ########################################################
35
+
36
+ if { [file exists "inputs/$sc_design.v"] } {
37
+ set input_verilog "inputs/$sc_design.v"
38
+ yosys read_verilog -noblackbox -sv $input_verilog
39
+ set file_type "v"
40
+ } elseif { [file exists "inputs/$sc_design.vg"] } {
41
+ set input_verilog "inputs/$sc_design.vg"
42
+ yosys read_verilog -noblackbox -sv $input_verilog
43
+ set file_type "vg"
44
+ } elseif { [sc_cfg_tool_task_exists var show_filepath] } {
45
+ yosys read_verilog -noblackbox -sv [sc_cfg_tool_task_get var show_filepath]
46
+ set file_type [lindex [sc_cfg_tool_task_get var show_filetype] 0]
47
+ }
48
+
49
+ ########################################################
50
+ # Override top level parameters
51
+ ########################################################
52
+
53
+ sc_apply_params
54
+
55
+ ########################################################
56
+ # Read Libraries
57
+ ########################################################
58
+
59
+ set sc_logiclibs [sc_get_asic_libraries logic]
60
+ set sc_macrolibs [sc_get_asic_libraries macro]
61
+
62
+ set sc_libraries [sc_cfg_tool_task_get {file} synthesis_libraries]
63
+ if { [sc_cfg_tool_task_exists {file} synthesis_libraries_macros] } {
64
+ set sc_macro_libraries \
65
+ [sc_cfg_tool_task_get {file} synthesis_libraries_macros]
66
+ } else {
67
+ set sc_macro_libraries []
68
+ }
69
+
70
+ set sc_blackboxes []
71
+ foreach lib $sc_macrolibs {
72
+ if { [sc_cfg_exists library $lib output blackbox verilog] } {
73
+ foreach lib_f [sc_cfg_get library $lib output blackbox verilog] {
74
+ lappend sc_blackboxes $lib_f
75
+ }
76
+ }
77
+ }
78
+
79
+ foreach lib_file "$sc_libraries $sc_macro_libraries" {
80
+ yosys read_liberty -lib $lib_file
81
+ }
82
+ foreach bb_file $sc_blackboxes {
83
+ yosys log "Reading blackbox model file: $bb_file"
84
+ yosys read_verilog -sv $bb_file
85
+ }
86
+
87
+ ########################################################
88
+ # Screenshot
89
+ ########################################################
90
+
91
+ yosys hierarchy -top $sc_design
92
+
93
+ if { $file_type == "v" } {
94
+ yosys proc
95
+ }
96
+
97
+ yosys show \
98
+ -nobg \
99
+ -format png \
100
+ -width \
101
+ -signed \
102
+ -stretch \
103
+ -prefix outputs/${sc_design} \
104
+ $sc_design
@@ -26,6 +26,12 @@ set sc_flow [sc_cfg_get option flow]
26
26
  set sc_optmode [sc_cfg_get option optmode]
27
27
  set sc_pdk [sc_cfg_get option pdk]
28
28
 
29
+ ########################################################
30
+ # Helper function
31
+ ########################################################
32
+
33
+ source "$sc_refdir/procs.tcl"
34
+
29
35
  ########################################################
30
36
  # Design Inputs
31
37
  ########################################################
@@ -57,15 +63,7 @@ if { [file exists "inputs/$sc_design.v"] } {
57
63
  # Override top level parameters
58
64
  ########################################################
59
65
 
60
- yosys chparam -list
61
- if { [sc_cfg_exists option param] } {
62
- dict for {key value} [sc_cfg_get option param] {
63
- if { ![string is integer $value] } {
64
- set value [concat \"$value\"]
65
- }
66
- yosys chparam -set $key $value $sc_design
67
- }
68
- }
66
+ sc_apply_params
69
67
 
70
68
  ########################################################
71
69
  # Synthesis based on mode
@@ -0,0 +1,153 @@
1
+ from siliconcompiler.tools.yosys.yosys import setup as tool_setup
2
+ import os
3
+ import siliconcompiler.tools.yosys.prepareLib as prepareLib
4
+ from siliconcompiler.tools._common.asic import get_libraries
5
+ from siliconcompiler.tools._common import get_tool_task
6
+ from siliconcompiler.targets import asap7_demo
7
+
8
+
9
+ def make_docs(chip):
10
+ chip.use(asap7_demo)
11
+
12
+
13
+ def setup(chip):
14
+ '''
15
+ Generate a screenshot of the design
16
+ '''
17
+
18
+ # Generic tool setup.
19
+ tool_setup(chip)
20
+
21
+ # ASIC-specific setup.
22
+ # setup_asic(chip)
23
+
24
+ step = chip.get('arg', 'step')
25
+ index = chip.get('arg', 'index')
26
+ tool, task = get_tool_task(chip, step, index)
27
+ chip.set('tool', tool, 'task', task, 'input', [], step=step, index=index)
28
+ chip.set('tool', tool, 'task', task, 'script', 'sc_screenshot.tcl',
29
+ step=step, index=index)
30
+
31
+ design = chip.top()
32
+ chip.set('tool', tool, 'task', task, 'output', [design + '.dot', design + '.png'],
33
+ step=step, index=index)
34
+
35
+
36
+ ################################
37
+ # format liberty files for yosys
38
+ ################################
39
+ def prepare_asic_libraries(chip):
40
+ step = chip.get('arg', 'step')
41
+ index = chip.get('arg', 'index')
42
+ tool, task = get_tool_task(chip, step, index)
43
+
44
+ # Clear in case of rerun
45
+ for libtype in ('synthesis_libraries', 'synthesis_libraries_macros'):
46
+ chip.set('tool', tool, 'task', task, 'file', libtype, [],
47
+ step=step, index=index)
48
+
49
+ # Generate synthesis_libraries and synthesis_macro_libraries for Yosys use
50
+
51
+ # mark libs with dont_use since ABC cannot get this information via its commands
52
+ # this also ensures the liberty files have been decompressed and corrected formatting
53
+ # issues that generally cannot be handled by yosys or yosys-abc
54
+ def get_synthesis_libraries(lib):
55
+ keypath = _get_synthesis_library_key(chip, lib)
56
+ if keypath and chip.valid(*keypath):
57
+ return chip.find_files(*keypath, step=step, index=index)
58
+ return []
59
+
60
+ for libtype in ('logic', 'macro'):
61
+ for lib in get_libraries(chip, libtype):
62
+ lib_content = {}
63
+ # Mark dont use
64
+ for lib_file in get_synthesis_libraries(lib):
65
+ # Ensure a unique name is used for library
66
+ lib_file_name_base = os.path.basename(lib_file)
67
+ if lib_file_name_base.lower().endswith('.gz'):
68
+ lib_file_name_base = lib_file_name_base[0:-3]
69
+ if lib_file_name_base.lower().endswith('.lib'):
70
+ lib_file_name_base = lib_file_name_base[0:-4]
71
+
72
+ lib_file_name = lib_file_name_base
73
+ unique_ident = 0
74
+ while lib_file_name in lib_content:
75
+ lib_file_name = f'{lib_file_name_base}_{unique_ident}'
76
+ unique_ident += 1
77
+
78
+ lib_content[lib_file_name] = prepareLib.processLibertyFile(
79
+ lib_file,
80
+ logger=None if chip.get('option', 'quiet',
81
+ step=step, index=index) else chip.logger)
82
+
83
+ if not lib_content:
84
+ continue
85
+
86
+ var_name = 'synthesis_libraries'
87
+ if libtype == "macro":
88
+ var_name = 'synthesis_libraries_macros'
89
+
90
+ for file, content in lib_content.items():
91
+ output_file = os.path.join(
92
+ chip.getworkdir(step=step, index=index),
93
+ 'inputs',
94
+ f'sc_{libtype}_{lib}_{file}.lib'
95
+ )
96
+
97
+ with open(output_file, 'w') as f:
98
+ f.write(content)
99
+
100
+ chip.add('tool', tool, 'task', task, 'file', var_name, output_file,
101
+ step=step, index=index)
102
+
103
+
104
+ def get_synthesis_corner(chip):
105
+ tool = 'yosys'
106
+ step = chip.get('arg', 'step')
107
+ index = chip.get('arg', 'index')
108
+ _, task = get_tool_task(chip, step, index)
109
+
110
+ syn_corners = chip.get('tool', tool, 'task', task, 'var', 'synthesis_corner',
111
+ step=step, index=index)
112
+ if syn_corners:
113
+ return syn_corners
114
+
115
+ # determine corner based on setup corner from constraints
116
+ corner = None
117
+ for constraint in chip.getkeys('constraint', 'timing'):
118
+ checks = chip.get('constraint', 'timing', constraint, 'check', step=step, index=index)
119
+ if "setup" in checks and not corner:
120
+ corner = chip.get('constraint', 'timing', constraint, 'libcorner',
121
+ step=step, index=index)
122
+
123
+ if not corner:
124
+ # try getting it from first constraint with a valid libcorner
125
+ for constraint in chip.getkeys('constraint', 'timing'):
126
+ if not corner:
127
+ corner = chip.get('constraint', 'timing', constraint, 'libcorner',
128
+ step=step, index=index)
129
+
130
+ return corner
131
+
132
+
133
+ def _get_synthesis_library_key(chip, lib):
134
+ if chip.valid('library', lib, 'option', 'file', 'yosys_synthesis_libraries'):
135
+ return ('library', lib, 'option', 'file', 'yosys_synthesis_libraries')
136
+
137
+ step = chip.get('arg', 'step')
138
+ index = chip.get('arg', 'index')
139
+ delaymodel = chip.get('asic', 'delaymodel', step=step, index=index)
140
+
141
+ for corner in chip.getkeys('library', lib, 'output'):
142
+ if chip.valid('library', lib, 'output', corner, delaymodel):
143
+ return ('library', lib, 'output', corner, delaymodel)
144
+
145
+ return None
146
+
147
+
148
+ ##################################################
149
+ def pre_process(chip):
150
+ ''' Tool specific function to run before step execution
151
+ '''
152
+
153
+ prepare_asic_libraries(chip)
@@ -74,6 +74,7 @@ def setup_asic(chip):
74
74
  mainlib = get_mainlib(chip)
75
75
  for option, value in [
76
76
  ('flatten', "true"),
77
+ ('auto_flatten', "true"),
77
78
  ('hier_iterations', "10"),
78
79
  ('hier_threshold', "1000"),
79
80
  ('autoname', "true"),
@@ -171,6 +172,8 @@ def setup_asic(chip):
171
172
  chip.set('tool', tool, 'task', task, 'var', 'add_buffers',
172
173
  'true/false, flag to indicate whether to add buffers or not.', field='help')
173
174
 
175
+ chip.set('tool', tool, 'task', task, 'var', 'auto_flatten',
176
+ 'true/false, attempt to determine how to flatten the design', field='help')
174
177
  chip.set('tool', tool, 'task', task, 'var', 'hier_iterations',
175
178
  'Number of iterations to attempt to determine the hierarchy to flatten',
176
179
  field='help')
@@ -1,8 +1,6 @@
1
1
  ####################
2
2
  # Helper functions
3
3
  ####################
4
- source "$sc_refdir/syn_asic_fpga_shared.tcl"
5
-
6
4
  proc preserve_modules { } {
7
5
  global sc_cfg
8
6
  global sc_tool
@@ -232,7 +230,7 @@ yosys synth {*}$synth_args -top $sc_design -run begin:fine
232
230
  sc_map_memory $sc_memory_libmap_files $sc_memory_techmap_files 0
233
231
 
234
232
  # Perform hierarchy flattening
235
- if { !$flatten_design } {
233
+ if { !$flatten_design && [lindex [sc_cfg_tool_task_get var auto_flatten] 0] == "true" } {
236
234
  set sc_hier_iterations \
237
235
  [lindex [sc_cfg_tool_task_get var hier_iterations] 0]
238
236
  set sc_hier_threshold \
@@ -1,5 +1,6 @@
1
- source "$sc_refdir/syn_asic_fpga_shared.tcl"
2
-
1
+ ####################
2
+ # Helper functions
3
+ ####################
3
4
  proc legalize_flops { feature_set } {
4
5
  set legalize_flop_types []
5
6
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "openroad": {
3
3
  "git-url": "https://github.com/The-OpenROAD-Project/OpenROAD.git",
4
- "git-commit": "3a75eb5d52a207622c3dfd52937d3a02488f76b5",
4
+ "git-commit": "ea63b9aa612f296523b0ec8a6b51dec94de8839c",
5
5
  "docker-cmds": [
6
6
  "# Remove OR-Tools files",
7
7
  "RUN rm -f $SC_PREFIX/Makefile $SC_PREFIX/README.md",
@@ -36,7 +36,7 @@
36
36
  "auto-update": false
37
37
  },
38
38
  "klayout": {
39
- "version": "0.29.7",
39
+ "version": "0.29.8",
40
40
  "git-url": "https://github.com/KLayout/klayout.git",
41
41
  "docker-skip": true,
42
42
  "auto-update": true,
@@ -45,7 +45,7 @@
45
45
  },
46
46
  "sv2v": {
47
47
  "git-url": "https://github.com/zachjs/sv2v.git",
48
- "git-commit": "5374679e4bb26e115b9a9b4a2d8ef4253d7a8bf3",
48
+ "git-commit": "7808819c48c167978aeb5ef34c6e5ed416e90875",
49
49
  "auto-update": true
50
50
  },
51
51
  "verilator": {
@@ -1,9 +1,10 @@
1
1
  import contextlib
2
+ import hashlib
2
3
  import os
3
4
  import re
4
5
  import psutil
5
6
  import shutil
6
- from pathlib import Path
7
+ from pathlib import Path, PurePosixPath
7
8
  from siliconcompiler._metadata import version as sc_version
8
9
  from jinja2 import Environment, FileSystemLoader
9
10
 
@@ -421,3 +422,31 @@ def truncate_text(text, width):
421
422
  text = text[:break_at-1] + '...' + text[break_at+3:]
422
423
 
423
424
  return text
425
+
426
+
427
+ def get_hashed_filename(path, package=None, hash=hashlib.sha1):
428
+ '''
429
+ Utility to map collected file to an unambiguous name based on its path.
430
+
431
+ The mapping looks like:
432
+ path/to/file.ext => file_<hash('path/to/file')>.ext
433
+ '''
434
+ path = PurePosixPath(path)
435
+ ext = ''.join(path.suffixes)
436
+
437
+ # strip off all file suffixes to get just the bare name
438
+ barepath = path
439
+ while barepath.suffix:
440
+ barepath = PurePosixPath(barepath.stem)
441
+ filename = str(barepath.parts[-1])
442
+
443
+ if not package:
444
+ package = ''
445
+ else:
446
+ package = f'{package}:'
447
+
448
+ path_to_hash = f'{package}{str(path)}'
449
+
450
+ pathhash = hash(path_to_hash.encode('utf-8')).hexdigest()
451
+
452
+ return f'{filename}_{pathhash}{ext}'
@@ -4,6 +4,7 @@ from siliconcompiler.tools.openroad import show as openroad_show
4
4
  from siliconcompiler.tools.openroad import screenshot as openroad_screenshot
5
5
  from siliconcompiler.tools.vpr import show as vpr_show
6
6
  from siliconcompiler.tools.vpr import screenshot as vpr_screenshot
7
+ from siliconcompiler.tools.yosys import screenshot as yosys_screenshot
7
8
 
8
9
 
9
10
  def setup(chip):
@@ -23,3 +24,6 @@ def setup(chip):
23
24
  chip.register_showtool('route', vpr_screenshot)
24
25
  chip.register_showtool('place', vpr_show)
25
26
  chip.register_showtool('place', vpr_screenshot)
27
+
28
+ chip.register_showtool('v', yosys_screenshot)
29
+ chip.register_showtool('vg', yosys_screenshot)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: siliconcompiler
3
- Version: 0.28.3
3
+ Version: 0.28.4
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
@@ -9,6 +9,19 @@ Project-URL: Documentation, https://docs.siliconcompiler.com
9
9
  Project-URL: Repository, https://github.com/siliconcompiler/siliconcompiler
10
10
  Project-URL: Issues, https://github.com/siliconcompiler/siliconcompiler/issues
11
11
  Project-URL: Discussion, https://github.com/siliconcompiler/siliconcompiler/discussions
12
+ Classifier: Environment :: Console
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Programming Language :: Python :: 3.8
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Operating System :: POSIX :: Linux
21
+ Classifier: Operating System :: MacOS
22
+ Classifier: Operating System :: Microsoft :: Windows
23
+ Classifier: Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)
24
+ Classifier: Topic :: Software Development :: Build Tools
12
25
  Requires-Python: >=3.8
13
26
  Description-Content-Type: text/markdown
14
27
  License-File: LICENSE
@@ -30,7 +43,7 @@ Requires-Dist: fasteners ==0.19
30
43
  Requires-Dist: fastjsonschema ==2.20.0
31
44
  Requires-Dist: docker ==7.1.0
32
45
  Requires-Dist: sc-surelog ==1.84.1
33
- Requires-Dist: orjson ==3.10.7
46
+ Requires-Dist: orjson ==3.10.10
34
47
  Requires-Dist: streamlit ==1.39.0
35
48
  Requires-Dist: streamlit-agraph ==0.0.45
36
49
  Requires-Dist: streamlit-antd-components ==0.3.2
@@ -40,7 +53,7 @@ Requires-Dist: importlib-metadata ; python_version < "3.10"
40
53
  Provides-Extra: docs
41
54
  Requires-Dist: Sphinx ==8.1.3 ; extra == 'docs'
42
55
  Requires-Dist: pip-licenses ==5.0.0 ; extra == 'docs'
43
- Requires-Dist: pydata-sphinx-theme ==0.15.4 ; extra == 'docs'
56
+ Requires-Dist: pydata-sphinx-theme ==0.16.0 ; extra == 'docs'
44
57
  Requires-Dist: sc-leflib >=0.2.0 ; extra == 'docs'
45
58
  Provides-Extra: examples
46
59
  Requires-Dist: migen ==0.9.2 ; extra == 'examples'