siliconcompiler 0.26.5__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 (251) hide show
  1. siliconcompiler/__init__.py +24 -0
  2. siliconcompiler/__main__.py +12 -0
  3. siliconcompiler/_common.py +49 -0
  4. siliconcompiler/_metadata.py +36 -0
  5. siliconcompiler/apps/__init__.py +0 -0
  6. siliconcompiler/apps/_common.py +76 -0
  7. siliconcompiler/apps/sc.py +92 -0
  8. siliconcompiler/apps/sc_dashboard.py +94 -0
  9. siliconcompiler/apps/sc_issue.py +178 -0
  10. siliconcompiler/apps/sc_remote.py +199 -0
  11. siliconcompiler/apps/sc_server.py +39 -0
  12. siliconcompiler/apps/sc_show.py +142 -0
  13. siliconcompiler/apps/smake.py +232 -0
  14. siliconcompiler/checklists/__init__.py +0 -0
  15. siliconcompiler/checklists/oh_tapeout.py +41 -0
  16. siliconcompiler/core.py +3221 -0
  17. siliconcompiler/data/RobotoMono/LICENSE.txt +202 -0
  18. siliconcompiler/data/RobotoMono/RobotoMono-Regular.ttf +0 -0
  19. siliconcompiler/data/heartbeat.v +18 -0
  20. siliconcompiler/data/logo.png +0 -0
  21. siliconcompiler/flowgraph.py +570 -0
  22. siliconcompiler/flows/__init__.py +0 -0
  23. siliconcompiler/flows/_common.py +67 -0
  24. siliconcompiler/flows/asicflow.py +180 -0
  25. siliconcompiler/flows/asictopflow.py +38 -0
  26. siliconcompiler/flows/dvflow.py +86 -0
  27. siliconcompiler/flows/fpgaflow.py +202 -0
  28. siliconcompiler/flows/generate_openroad_rcx.py +66 -0
  29. siliconcompiler/flows/lintflow.py +35 -0
  30. siliconcompiler/flows/screenshotflow.py +51 -0
  31. siliconcompiler/flows/showflow.py +59 -0
  32. siliconcompiler/flows/signoffflow.py +53 -0
  33. siliconcompiler/flows/synflow.py +128 -0
  34. siliconcompiler/fpgas/__init__.py +0 -0
  35. siliconcompiler/fpgas/lattice_ice40.py +42 -0
  36. siliconcompiler/fpgas/vpr_example.py +109 -0
  37. siliconcompiler/issue.py +300 -0
  38. siliconcompiler/libs/__init__.py +0 -0
  39. siliconcompiler/libs/asap7sc7p5t.py +8 -0
  40. siliconcompiler/libs/gf180mcu.py +8 -0
  41. siliconcompiler/libs/nangate45.py +8 -0
  42. siliconcompiler/libs/sky130hd.py +8 -0
  43. siliconcompiler/libs/sky130io.py +8 -0
  44. siliconcompiler/package.py +412 -0
  45. siliconcompiler/pdks/__init__.py +0 -0
  46. siliconcompiler/pdks/asap7.py +8 -0
  47. siliconcompiler/pdks/freepdk45.py +8 -0
  48. siliconcompiler/pdks/gf180.py +8 -0
  49. siliconcompiler/pdks/skywater130.py +8 -0
  50. siliconcompiler/remote/__init__.py +36 -0
  51. siliconcompiler/remote/client.py +891 -0
  52. siliconcompiler/remote/schema.py +106 -0
  53. siliconcompiler/remote/server.py +507 -0
  54. siliconcompiler/remote/server_schema/requests/cancel_job.json +51 -0
  55. siliconcompiler/remote/server_schema/requests/check_progress.json +61 -0
  56. siliconcompiler/remote/server_schema/requests/check_server.json +38 -0
  57. siliconcompiler/remote/server_schema/requests/delete_job.json +51 -0
  58. siliconcompiler/remote/server_schema/requests/get_results.json +48 -0
  59. siliconcompiler/remote/server_schema/requests/remote_run.json +40 -0
  60. siliconcompiler/remote/server_schema/responses/cancel_job.json +18 -0
  61. siliconcompiler/remote/server_schema/responses/check_progress.json +30 -0
  62. siliconcompiler/remote/server_schema/responses/check_server.json +32 -0
  63. siliconcompiler/remote/server_schema/responses/delete_job.json +18 -0
  64. siliconcompiler/remote/server_schema/responses/get_results.json +21 -0
  65. siliconcompiler/remote/server_schema/responses/remote_run.json +25 -0
  66. siliconcompiler/report/__init__.py +13 -0
  67. siliconcompiler/report/html_report.py +74 -0
  68. siliconcompiler/report/report.py +355 -0
  69. siliconcompiler/report/streamlit_report.py +137 -0
  70. siliconcompiler/report/streamlit_viewer.py +944 -0
  71. siliconcompiler/report/summary_image.py +117 -0
  72. siliconcompiler/report/summary_table.py +105 -0
  73. siliconcompiler/report/utils.py +163 -0
  74. siliconcompiler/scheduler/__init__.py +2092 -0
  75. siliconcompiler/scheduler/docker_runner.py +253 -0
  76. siliconcompiler/scheduler/run_node.py +138 -0
  77. siliconcompiler/scheduler/send_messages.py +178 -0
  78. siliconcompiler/scheduler/slurm.py +208 -0
  79. siliconcompiler/scheduler/validation/email_credentials.json +54 -0
  80. siliconcompiler/schema/__init__.py +7 -0
  81. siliconcompiler/schema/schema_cfg.py +4014 -0
  82. siliconcompiler/schema/schema_obj.py +1841 -0
  83. siliconcompiler/schema/utils.py +93 -0
  84. siliconcompiler/sphinx_ext/__init__.py +0 -0
  85. siliconcompiler/sphinx_ext/dynamicgen.py +1006 -0
  86. siliconcompiler/sphinx_ext/schemagen.py +221 -0
  87. siliconcompiler/sphinx_ext/utils.py +166 -0
  88. siliconcompiler/targets/__init__.py +0 -0
  89. siliconcompiler/targets/asap7_demo.py +68 -0
  90. siliconcompiler/targets/asic_demo.py +38 -0
  91. siliconcompiler/targets/fpgaflow_demo.py +47 -0
  92. siliconcompiler/targets/freepdk45_demo.py +59 -0
  93. siliconcompiler/targets/gf180_demo.py +77 -0
  94. siliconcompiler/targets/skywater130_demo.py +70 -0
  95. siliconcompiler/templates/email/general.j2 +66 -0
  96. siliconcompiler/templates/email/summary.j2 +43 -0
  97. siliconcompiler/templates/issue/README.txt +26 -0
  98. siliconcompiler/templates/issue/run.sh +6 -0
  99. siliconcompiler/templates/report/bootstrap.min.css +7 -0
  100. siliconcompiler/templates/report/bootstrap.min.js +7 -0
  101. siliconcompiler/templates/report/bootstrap_LICENSE.md +24 -0
  102. siliconcompiler/templates/report/sc_report.j2 +427 -0
  103. siliconcompiler/templates/slurm/run.sh +9 -0
  104. siliconcompiler/templates/tcl/manifest.tcl.j2 +137 -0
  105. siliconcompiler/tools/__init__.py +0 -0
  106. siliconcompiler/tools/_common/__init__.py +432 -0
  107. siliconcompiler/tools/_common/asic.py +115 -0
  108. siliconcompiler/tools/_common/sdc/sc_constraints.sdc +76 -0
  109. siliconcompiler/tools/_common/tcl/sc_pin_constraints.tcl +63 -0
  110. siliconcompiler/tools/bambu/bambu.py +32 -0
  111. siliconcompiler/tools/bambu/convert.py +77 -0
  112. siliconcompiler/tools/bluespec/bluespec.py +40 -0
  113. siliconcompiler/tools/bluespec/convert.py +103 -0
  114. siliconcompiler/tools/builtin/_common.py +155 -0
  115. siliconcompiler/tools/builtin/builtin.py +26 -0
  116. siliconcompiler/tools/builtin/concatenate.py +85 -0
  117. siliconcompiler/tools/builtin/join.py +27 -0
  118. siliconcompiler/tools/builtin/maximum.py +46 -0
  119. siliconcompiler/tools/builtin/minimum.py +57 -0
  120. siliconcompiler/tools/builtin/mux.py +70 -0
  121. siliconcompiler/tools/builtin/nop.py +38 -0
  122. siliconcompiler/tools/builtin/verify.py +83 -0
  123. siliconcompiler/tools/chisel/SCDriver.scala +10 -0
  124. siliconcompiler/tools/chisel/build.sbt +27 -0
  125. siliconcompiler/tools/chisel/chisel.py +37 -0
  126. siliconcompiler/tools/chisel/convert.py +140 -0
  127. siliconcompiler/tools/execute/exec_input.py +41 -0
  128. siliconcompiler/tools/execute/execute.py +17 -0
  129. siliconcompiler/tools/genfasm/bitstream.py +61 -0
  130. siliconcompiler/tools/genfasm/genfasm.py +40 -0
  131. siliconcompiler/tools/ghdl/convert.py +87 -0
  132. siliconcompiler/tools/ghdl/ghdl.py +41 -0
  133. siliconcompiler/tools/icarus/compile.py +87 -0
  134. siliconcompiler/tools/icarus/icarus.py +36 -0
  135. siliconcompiler/tools/icepack/bitstream.py +20 -0
  136. siliconcompiler/tools/icepack/icepack.py +43 -0
  137. siliconcompiler/tools/klayout/export.py +117 -0
  138. siliconcompiler/tools/klayout/klayout.py +119 -0
  139. siliconcompiler/tools/klayout/klayout_export.py +205 -0
  140. siliconcompiler/tools/klayout/klayout_operations.py +363 -0
  141. siliconcompiler/tools/klayout/klayout_show.py +242 -0
  142. siliconcompiler/tools/klayout/klayout_utils.py +176 -0
  143. siliconcompiler/tools/klayout/operations.py +194 -0
  144. siliconcompiler/tools/klayout/screenshot.py +98 -0
  145. siliconcompiler/tools/klayout/show.py +101 -0
  146. siliconcompiler/tools/magic/drc.py +49 -0
  147. siliconcompiler/tools/magic/extspice.py +19 -0
  148. siliconcompiler/tools/magic/magic.py +85 -0
  149. siliconcompiler/tools/magic/sc_drc.tcl +96 -0
  150. siliconcompiler/tools/magic/sc_extspice.tcl +54 -0
  151. siliconcompiler/tools/magic/sc_magic.tcl +47 -0
  152. siliconcompiler/tools/montage/montage.py +30 -0
  153. siliconcompiler/tools/montage/tile.py +66 -0
  154. siliconcompiler/tools/netgen/count_lvs.py +132 -0
  155. siliconcompiler/tools/netgen/lvs.py +90 -0
  156. siliconcompiler/tools/netgen/netgen.py +36 -0
  157. siliconcompiler/tools/netgen/sc_lvs.tcl +46 -0
  158. siliconcompiler/tools/nextpnr/apr.py +24 -0
  159. siliconcompiler/tools/nextpnr/nextpnr.py +59 -0
  160. siliconcompiler/tools/openfpgaloader/openfpgaloader.py +39 -0
  161. siliconcompiler/tools/openroad/__init__.py +0 -0
  162. siliconcompiler/tools/openroad/cts.py +45 -0
  163. siliconcompiler/tools/openroad/dfm.py +66 -0
  164. siliconcompiler/tools/openroad/export.py +131 -0
  165. siliconcompiler/tools/openroad/floorplan.py +70 -0
  166. siliconcompiler/tools/openroad/openroad.py +977 -0
  167. siliconcompiler/tools/openroad/physyn.py +27 -0
  168. siliconcompiler/tools/openroad/place.py +41 -0
  169. siliconcompiler/tools/openroad/rcx_bench.py +95 -0
  170. siliconcompiler/tools/openroad/rcx_extract.py +34 -0
  171. siliconcompiler/tools/openroad/route.py +45 -0
  172. siliconcompiler/tools/openroad/screenshot.py +60 -0
  173. siliconcompiler/tools/openroad/scripts/sc_apr.tcl +499 -0
  174. siliconcompiler/tools/openroad/scripts/sc_cts.tcl +64 -0
  175. siliconcompiler/tools/openroad/scripts/sc_dfm.tcl +20 -0
  176. siliconcompiler/tools/openroad/scripts/sc_export.tcl +98 -0
  177. siliconcompiler/tools/openroad/scripts/sc_floorplan.tcl +413 -0
  178. siliconcompiler/tools/openroad/scripts/sc_metrics.tcl +158 -0
  179. siliconcompiler/tools/openroad/scripts/sc_physyn.tcl +7 -0
  180. siliconcompiler/tools/openroad/scripts/sc_place.tcl +84 -0
  181. siliconcompiler/tools/openroad/scripts/sc_procs.tcl +423 -0
  182. siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +63 -0
  183. siliconcompiler/tools/openroad/scripts/sc_rcx_bench.tcl +20 -0
  184. siliconcompiler/tools/openroad/scripts/sc_rcx_extract.tcl +12 -0
  185. siliconcompiler/tools/openroad/scripts/sc_route.tcl +133 -0
  186. siliconcompiler/tools/openroad/scripts/sc_screenshot.tcl +21 -0
  187. siliconcompiler/tools/openroad/scripts/sc_write.tcl +5 -0
  188. siliconcompiler/tools/openroad/scripts/sc_write_images.tcl +361 -0
  189. siliconcompiler/tools/openroad/show.py +94 -0
  190. siliconcompiler/tools/openroad/templates/pex.tcl +8 -0
  191. siliconcompiler/tools/opensta/__init__.py +101 -0
  192. siliconcompiler/tools/opensta/report_libraries.py +28 -0
  193. siliconcompiler/tools/opensta/scripts/sc_procs.tcl +47 -0
  194. siliconcompiler/tools/opensta/scripts/sc_report_libraries.tcl +74 -0
  195. siliconcompiler/tools/opensta/scripts/sc_timing.tcl +268 -0
  196. siliconcompiler/tools/opensta/timing.py +214 -0
  197. siliconcompiler/tools/slang/__init__.py +49 -0
  198. siliconcompiler/tools/slang/lint.py +101 -0
  199. siliconcompiler/tools/surelog/__init__.py +123 -0
  200. siliconcompiler/tools/surelog/parse.py +183 -0
  201. siliconcompiler/tools/surelog/templates/output.v +7 -0
  202. siliconcompiler/tools/sv2v/convert.py +46 -0
  203. siliconcompiler/tools/sv2v/sv2v.py +37 -0
  204. siliconcompiler/tools/template/template.py +125 -0
  205. siliconcompiler/tools/verilator/compile.py +139 -0
  206. siliconcompiler/tools/verilator/lint.py +19 -0
  207. siliconcompiler/tools/verilator/parse.py +27 -0
  208. siliconcompiler/tools/verilator/verilator.py +172 -0
  209. siliconcompiler/tools/vivado/__init__.py +7 -0
  210. siliconcompiler/tools/vivado/bitstream.py +21 -0
  211. siliconcompiler/tools/vivado/place.py +21 -0
  212. siliconcompiler/tools/vivado/route.py +21 -0
  213. siliconcompiler/tools/vivado/scripts/sc_bitstream.tcl +6 -0
  214. siliconcompiler/tools/vivado/scripts/sc_place.tcl +2 -0
  215. siliconcompiler/tools/vivado/scripts/sc_route.tcl +4 -0
  216. siliconcompiler/tools/vivado/scripts/sc_run.tcl +45 -0
  217. siliconcompiler/tools/vivado/scripts/sc_syn_fpga.tcl +25 -0
  218. siliconcompiler/tools/vivado/syn_fpga.py +20 -0
  219. siliconcompiler/tools/vivado/vivado.py +147 -0
  220. siliconcompiler/tools/vpr/_json_constraint.py +63 -0
  221. siliconcompiler/tools/vpr/_xml_constraint.py +109 -0
  222. siliconcompiler/tools/vpr/place.py +137 -0
  223. siliconcompiler/tools/vpr/route.py +124 -0
  224. siliconcompiler/tools/vpr/screenshot.py +54 -0
  225. siliconcompiler/tools/vpr/show.py +88 -0
  226. siliconcompiler/tools/vpr/vpr.py +357 -0
  227. siliconcompiler/tools/xyce/xyce.py +36 -0
  228. siliconcompiler/tools/yosys/lec.py +56 -0
  229. siliconcompiler/tools/yosys/prepareLib.py +59 -0
  230. siliconcompiler/tools/yosys/sc_lec.tcl +84 -0
  231. siliconcompiler/tools/yosys/sc_syn.tcl +79 -0
  232. siliconcompiler/tools/yosys/syn_asic.py +565 -0
  233. siliconcompiler/tools/yosys/syn_asic.tcl +377 -0
  234. siliconcompiler/tools/yosys/syn_asic_fpga_shared.tcl +31 -0
  235. siliconcompiler/tools/yosys/syn_fpga.py +146 -0
  236. siliconcompiler/tools/yosys/syn_fpga.tcl +233 -0
  237. siliconcompiler/tools/yosys/syn_strategies.tcl +81 -0
  238. siliconcompiler/tools/yosys/techmaps/lcu_kogge_stone.v +39 -0
  239. siliconcompiler/tools/yosys/templates/abc.const +2 -0
  240. siliconcompiler/tools/yosys/yosys.py +147 -0
  241. siliconcompiler/units.py +259 -0
  242. siliconcompiler/use.py +177 -0
  243. siliconcompiler/utils/__init__.py +423 -0
  244. siliconcompiler/utils/asic.py +158 -0
  245. siliconcompiler/utils/showtools.py +25 -0
  246. siliconcompiler-0.26.5.dist-info/LICENSE +190 -0
  247. siliconcompiler-0.26.5.dist-info/METADATA +195 -0
  248. siliconcompiler-0.26.5.dist-info/RECORD +251 -0
  249. siliconcompiler-0.26.5.dist-info/WHEEL +5 -0
  250. siliconcompiler-0.26.5.dist-info/entry_points.txt +12 -0
  251. siliconcompiler-0.26.5.dist-info/top_level.txt +1 -0
@@ -0,0 +1,259 @@
1
+ import math
2
+ import re
3
+
4
+ SI_UNITS = (
5
+ ('y', -24),
6
+ ('z', -21),
7
+ ('a', -18),
8
+ ('f', -15),
9
+ ('p', -12),
10
+ ('n', -9),
11
+ ('u', -6),
12
+ ('m', -3),
13
+ ('', 0),
14
+ ('k', 3),
15
+ ('M', 6),
16
+ ('G', 9),
17
+ ('T', 12),
18
+ ('P', 15),
19
+ ('E', 18),
20
+ ('Z', 21),
21
+ ('Y', 24)
22
+ )
23
+
24
+ BINARY_UNITS = (
25
+ ('', 0),
26
+ ('k', 10),
27
+ ('M', 20),
28
+ ('G', 30),
29
+ ('T', 40),
30
+ ('P', 50),
31
+ ('E', 60),
32
+ ('Z', 70)
33
+ )
34
+
35
+ SI_TYPES = (
36
+ 's',
37
+ 'Hz',
38
+ 'F',
39
+ 'm',
40
+ 'A',
41
+ 'V',
42
+ 'W',
43
+ 'ohm',
44
+ 'C',
45
+ )
46
+
47
+
48
+ BINARY_TYPES = (
49
+ 'B',
50
+ 'b'
51
+ )
52
+
53
+
54
+ def convert(value, from_unit=None, to_unit=None):
55
+ '''
56
+ Convert a value to from one SI power to another SI power
57
+
58
+ Args:
59
+ value (float): value to convert
60
+ from_unit (str): unit of the value, default is None and assumes no magnitude
61
+ to_unit (str): unit of the return, default is None and assumes no magnitude
62
+
63
+ Returns:
64
+ float: scaled value
65
+ '''
66
+ value = float(value)
67
+
68
+ power = get_si_power(to_unit)
69
+
70
+ from_scale = _get_scale(from_unit) ** power
71
+ to_scale = _get_scale(to_unit) ** power
72
+ scale = from_scale / to_scale
73
+ if scale > 1:
74
+ scale = round(scale)
75
+ elif scale < 1:
76
+ scale = 1.0 / round(1.0 / scale)
77
+ else:
78
+ scale = round(scale)
79
+
80
+ return value * scale
81
+
82
+
83
+ def _get_scale(unit):
84
+ if not unit:
85
+ unit = ''
86
+ unit_prefix = get_si_prefix(unit)
87
+ for prefix, scale in SI_UNITS:
88
+ if prefix == unit_prefix:
89
+ return 10**scale
90
+
91
+ return 1
92
+
93
+
94
+ def get_si_prefix(unit):
95
+ '''
96
+ Get the SI prefix of the specific unit.
97
+
98
+ For example:
99
+ get_si_prefix('um') -> 'u'
100
+ '''
101
+ if not unit:
102
+ return ''
103
+
104
+ for si_type in list(SI_TYPES) + ['']:
105
+ re_find = fr'^(.*){si_type}(\^[0-9]+)?$'
106
+ matches = re.findall(re_find, unit, re.IGNORECASE)
107
+ if matches:
108
+ return matches[0][0]
109
+
110
+ return ''
111
+
112
+
113
+ def get_si_power(unit):
114
+ '''
115
+ Get the SI power of the specific unit.
116
+ This is mainly needed for area units.
117
+
118
+ For example:
119
+ get_si_prefix('um') -> 1
120
+ get_si_prefix('um^2') -> 2
121
+ '''
122
+ if not unit:
123
+ return 1
124
+
125
+ for si_type in list(SI_TYPES) + ['']:
126
+ re_find = fr'^.*{si_type}\^([0-9]+)$'
127
+ matches = re.findall(re_find, unit, re.IGNORECASE)
128
+ if matches:
129
+ return int(matches[0][-1])
130
+
131
+ return 1
132
+
133
+
134
+ def is_base_si_unit(unit):
135
+ '''
136
+ Check if a unit has no magnitude
137
+ '''
138
+ return unit in SI_TYPES
139
+
140
+
141
+ def is_base_si_unit_power(unit):
142
+ '''
143
+ Check if a unit has a power associated with it
144
+ '''
145
+ return get_si_power(unit) > 1
146
+
147
+
148
+ def is_base_binary_unit(unit):
149
+ '''
150
+ Check if a unit is binary
151
+ '''
152
+ return unit in BINARY_TYPES
153
+
154
+
155
+ def format_si(value, unit, margin=3, digits=3):
156
+ '''
157
+ Format a number as an SI number. Returns a string.
158
+
159
+ Args:
160
+ value (float): value to convert
161
+ unit (str): unit of the value
162
+ margin (int): number of extra digits to ensure are preserved
163
+ when picking the right magnitude
164
+ digits (int): number of digits to print after .
165
+ '''
166
+ scaled_value, prefix = scale_si(value, unit, margin=margin, digits=digits)
167
+ # need to do this in case float shortens scaled_value
168
+ return f'{scaled_value:.{digits}f}{prefix}'
169
+
170
+
171
+ def scale_si(value, unit, margin=3, digits=3):
172
+ '''
173
+ Format a number as an SI number. Returns a float.
174
+
175
+ Args:
176
+ value (float): value to convert
177
+ unit (str): unit of the value
178
+ margin (int): number of extra digits to ensure are preserved
179
+ when picking the right magnitude
180
+ digits (int): number of digits to print after .
181
+ '''
182
+ if unit and is_base_si_unit(unit):
183
+ value = float(value)
184
+ log_value = math.log10(value) - margin
185
+
186
+ if digits < 0:
187
+ # Default to 0
188
+ digits = 0
189
+
190
+ for prefix, scale in SI_UNITS:
191
+ if log_value <= scale:
192
+ value /= 10**scale
193
+ return (float(f'{value:.{digits}f}'), prefix)
194
+
195
+ return (float(f'{value:.{digits}f}'), '')
196
+
197
+ return (float(f'{value:.{digits}f}'), '')
198
+
199
+
200
+ def format_binary(value, unit, digits=3):
201
+ '''
202
+ Format a number as a binary number. Returns a string.
203
+
204
+ Args:
205
+ value (float): value to convert
206
+ unit (str): unit of the value
207
+ digits (int): number of digits to print after .
208
+ '''
209
+ scaled_value, prefix = scale_binary(value, unit, digits=digits)
210
+ # need to do this in case float shortens scaled_value
211
+ return f'{scaled_value:.{digits}f}{prefix}'
212
+
213
+
214
+ def scale_binary(value, unit, digits=3):
215
+ '''
216
+ Format a number as a binary number. Returns a float.
217
+
218
+ Args:
219
+ value (float): value to convert
220
+ unit (str): unit of the value
221
+ digits (int): number of digits to print after .
222
+ '''
223
+ value = float(value)
224
+
225
+ fvalue = (int(value), '')
226
+ if is_base_binary_unit(unit):
227
+ for prefix, scale in BINARY_UNITS:
228
+ new_value = value / 2**scale
229
+
230
+ if new_value > 1:
231
+ fvalue = (float(f'{new_value:.{digits}f}'), prefix)
232
+ continue
233
+
234
+ return fvalue
235
+
236
+ return (float(f'{value:.{digits}f}'), '')
237
+
238
+
239
+ def format_time(value):
240
+ '''
241
+ Format a number as time.
242
+ Prints as hh:mm:ss.ms (hours:minutes:seconds.milliseconds)
243
+
244
+ Args:
245
+ value (float): number of seconds to convert
246
+ '''
247
+ # Report as hh:mm::ss.ms
248
+ value, milliseconds = divmod(value, 1)
249
+ hours, value = divmod(value, 3600)
250
+ minutes, seconds = divmod(value, 60)
251
+ milliseconds *= 1000
252
+ ftime = ''
253
+ if hours > 0:
254
+ ftime += f'{int(hours)}:'
255
+ if hours > 0 or minutes > 0:
256
+ ftime += f'{int(minutes):02}:'
257
+ ftime += f'{int(seconds):02}.'
258
+ ftime += f'{int(milliseconds):03}'
259
+ return ftime
siliconcompiler/use.py ADDED
@@ -0,0 +1,177 @@
1
+ # Copyright 2023 Silicon Compiler Authors. All Rights Reserved.
2
+
3
+ from siliconcompiler import Chip
4
+
5
+
6
+ class PackageChip(Chip):
7
+ def __init__(self, chip, name, package=None):
8
+ # Start with None as init setting will not depend on package
9
+ self.__package = None
10
+
11
+ super().__init__(name)
12
+ self.logger = chip.logger
13
+
14
+ path = None
15
+ ref = None
16
+ if isinstance(package, (tuple, list)):
17
+ if len(package) == 3:
18
+ package, path, ref = package
19
+ elif len(package) == 2:
20
+ package, path = package
21
+ else:
22
+ raise ValueError(f"{package} should be a 2 or 3 item tuple or list.")
23
+ elif isinstance(package, dict):
24
+ if len(package) == 1:
25
+ info = list(package.values())[0]
26
+ if "path" not in info:
27
+ raise ValueError(f"{package} should contain a path key.")
28
+ path = info["path"]
29
+ if "ref" in info:
30
+ ref = info["ref"]
31
+
32
+ package = list(package.keys())[0]
33
+ else:
34
+ raise ValueError(f"{package} cannot contain multiple packages.")
35
+ elif isinstance(package, str):
36
+ pass
37
+ else:
38
+ if package is not None:
39
+ raise ValueError(f"{package} is not supported.")
40
+
41
+ if path:
42
+ self.register_source(package, path, ref=ref)
43
+
44
+ self.__package = package
45
+
46
+ # Clear all copy flags since these are libraries, pdks, fpga, etc.
47
+ for key in self.allkeys():
48
+ sc_type = self.get(*key, field='type')
49
+ if 'file' in sc_type or 'dir' in sc_type:
50
+ self.set(*key, False, field='copy')
51
+
52
+ def add(self, *args, field='value', step=None, index=None, package=None):
53
+ if not package:
54
+ package = self.__package
55
+ super().add(*args, field=field, step=step,
56
+ index=index, package=package)
57
+
58
+ def set(self, *args, field='value', clobber=True, step=None, index=None, package=None):
59
+ if not package:
60
+ package = self.__package
61
+ super().set(*args, field=field, clobber=clobber, step=step,
62
+ index=index, package=package)
63
+
64
+ def input(self, filename, fileset=None, filetype=None, iomap=None,
65
+ step=None, index=None, package=None):
66
+ self._add_input_output('input', filename, fileset, filetype, iomap,
67
+ step=step, index=index, package=package,
68
+ quiet=True)
69
+
70
+ def output(self, filename, fileset=None, filetype=None, iomap=None,
71
+ step=None, index=None, package=None):
72
+ self._add_input_output('output', filename, fileset, filetype, iomap,
73
+ step=step, index=index, package=package,
74
+ quiet=True)
75
+
76
+
77
+ class PDK(PackageChip):
78
+ """
79
+ Object for configuring a process development kit.
80
+ This is the main object used for configuration and data for a PDK
81
+ within the SiliconCompiler platform.
82
+
83
+ This inherits all methods from :class:`~siliconcompiler.Chip`.
84
+
85
+ Args:
86
+ chip (Chip): A real only copy of the parent chip.
87
+ name (string): Name of the PDK.
88
+ package (string): Name of the data source
89
+ Examples:
90
+ >>> siliconcompiler.PDK(chip, "asap7")
91
+ Creates a flow object with name "asap7".
92
+ """
93
+
94
+
95
+ class FPGA(PackageChip):
96
+ """
97
+ Object for configuring an FPGA
98
+ This is the main object used for configuration and data for a FPGA
99
+ within the SiliconCompiler platform.
100
+
101
+ This inherits all methods from :class:`~siliconcompiler.Chip`.
102
+
103
+ Args:
104
+ chip (Chip): A real only copy of the parent chip.
105
+ name (string): Name of the FPGA.
106
+ package (string): Name of the data source
107
+ Examples:
108
+ >>> siliconcompiler.FPGA(chip, "lattice_ice40")
109
+ Creates a flow object with name "lattice_ice40".
110
+ """
111
+
112
+
113
+ class Library(PackageChip):
114
+ """
115
+ Object for configuring a library.
116
+ This is the main object used for configuration and data for a library
117
+ within the SiliconCompiler platform.
118
+
119
+ This inherits all methods from :class:`~siliconcompiler.Chip`.
120
+
121
+ Args:
122
+ chip (Chip): A real only copy of the parent chip.
123
+ name (string): Name of the library.
124
+ package (string): Name of the data source
125
+ auto_enable (boolean): If True, will automatically be added to ['option','library'].
126
+ This is only valid for non-logiclibs and macrolibs
127
+ Examples:
128
+ >>> siliconcompiler.Library(chip, "asap7sc7p5t")
129
+ Creates a library object with name "asap7sc7p5t".
130
+ """
131
+ def __init__(self, chip, name, package=None, auto_enable=False):
132
+ super().__init__(chip, name, package=package)
133
+
134
+ self.__auto_enable = auto_enable
135
+
136
+ def is_auto_enable(self):
137
+ return self.__auto_enable
138
+
139
+
140
+ class Flow(Chip):
141
+ """
142
+ Object for configuring a flow.
143
+ This is the main object used for configuration and data for a flow
144
+ within the SiliconCompiler platform.
145
+
146
+ This inherits all methods from :class:`~siliconcompiler.Chip`.
147
+
148
+ Args:
149
+ chip (Chip): A real only copy of the parent chip.
150
+ name (string): Name of the flow.
151
+ Examples:
152
+ >>> siliconcompiler.Flow(chip, "asicflow")
153
+ Creates a flow object with name "asicflow".
154
+ """
155
+ def __init__(self, chip, name):
156
+ super().__init__(name)
157
+ self.logger = chip.logger
158
+
159
+
160
+ class Checklist(Chip):
161
+ """
162
+ Object for configuring a checklist.
163
+ This is the main object used for configuration and data for a checklist
164
+ within the SiliconCompiler platform.
165
+
166
+ This inherits all methods from :class:`~siliconcompiler.Chip`.
167
+
168
+ Args:
169
+ chip (Chip): A real only copy of the parent chip.
170
+ name (string): Name of the checklist.
171
+ Examples:
172
+ >>> siliconcompiler.Checklist(chip, "tapeout")
173
+ Creates a checklist object with name "tapeout".
174
+ """
175
+ def __init__(self, chip, name):
176
+ super().__init__(name)
177
+ self.logger = chip.logger