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.
- siliconcompiler/__init__.py +24 -0
- siliconcompiler/__main__.py +12 -0
- siliconcompiler/_common.py +49 -0
- siliconcompiler/_metadata.py +36 -0
- siliconcompiler/apps/__init__.py +0 -0
- siliconcompiler/apps/_common.py +76 -0
- siliconcompiler/apps/sc.py +92 -0
- siliconcompiler/apps/sc_dashboard.py +94 -0
- siliconcompiler/apps/sc_issue.py +178 -0
- siliconcompiler/apps/sc_remote.py +199 -0
- siliconcompiler/apps/sc_server.py +39 -0
- siliconcompiler/apps/sc_show.py +142 -0
- siliconcompiler/apps/smake.py +232 -0
- siliconcompiler/checklists/__init__.py +0 -0
- siliconcompiler/checklists/oh_tapeout.py +41 -0
- siliconcompiler/core.py +3221 -0
- siliconcompiler/data/RobotoMono/LICENSE.txt +202 -0
- siliconcompiler/data/RobotoMono/RobotoMono-Regular.ttf +0 -0
- siliconcompiler/data/heartbeat.v +18 -0
- siliconcompiler/data/logo.png +0 -0
- siliconcompiler/flowgraph.py +570 -0
- siliconcompiler/flows/__init__.py +0 -0
- siliconcompiler/flows/_common.py +67 -0
- siliconcompiler/flows/asicflow.py +180 -0
- siliconcompiler/flows/asictopflow.py +38 -0
- siliconcompiler/flows/dvflow.py +86 -0
- siliconcompiler/flows/fpgaflow.py +202 -0
- siliconcompiler/flows/generate_openroad_rcx.py +66 -0
- siliconcompiler/flows/lintflow.py +35 -0
- siliconcompiler/flows/screenshotflow.py +51 -0
- siliconcompiler/flows/showflow.py +59 -0
- siliconcompiler/flows/signoffflow.py +53 -0
- siliconcompiler/flows/synflow.py +128 -0
- siliconcompiler/fpgas/__init__.py +0 -0
- siliconcompiler/fpgas/lattice_ice40.py +42 -0
- siliconcompiler/fpgas/vpr_example.py +109 -0
- siliconcompiler/issue.py +300 -0
- siliconcompiler/libs/__init__.py +0 -0
- siliconcompiler/libs/asap7sc7p5t.py +8 -0
- siliconcompiler/libs/gf180mcu.py +8 -0
- siliconcompiler/libs/nangate45.py +8 -0
- siliconcompiler/libs/sky130hd.py +8 -0
- siliconcompiler/libs/sky130io.py +8 -0
- siliconcompiler/package.py +412 -0
- siliconcompiler/pdks/__init__.py +0 -0
- siliconcompiler/pdks/asap7.py +8 -0
- siliconcompiler/pdks/freepdk45.py +8 -0
- siliconcompiler/pdks/gf180.py +8 -0
- siliconcompiler/pdks/skywater130.py +8 -0
- siliconcompiler/remote/__init__.py +36 -0
- siliconcompiler/remote/client.py +891 -0
- siliconcompiler/remote/schema.py +106 -0
- siliconcompiler/remote/server.py +507 -0
- siliconcompiler/remote/server_schema/requests/cancel_job.json +51 -0
- siliconcompiler/remote/server_schema/requests/check_progress.json +61 -0
- siliconcompiler/remote/server_schema/requests/check_server.json +38 -0
- siliconcompiler/remote/server_schema/requests/delete_job.json +51 -0
- siliconcompiler/remote/server_schema/requests/get_results.json +48 -0
- siliconcompiler/remote/server_schema/requests/remote_run.json +40 -0
- siliconcompiler/remote/server_schema/responses/cancel_job.json +18 -0
- siliconcompiler/remote/server_schema/responses/check_progress.json +30 -0
- siliconcompiler/remote/server_schema/responses/check_server.json +32 -0
- siliconcompiler/remote/server_schema/responses/delete_job.json +18 -0
- siliconcompiler/remote/server_schema/responses/get_results.json +21 -0
- siliconcompiler/remote/server_schema/responses/remote_run.json +25 -0
- siliconcompiler/report/__init__.py +13 -0
- siliconcompiler/report/html_report.py +74 -0
- siliconcompiler/report/report.py +355 -0
- siliconcompiler/report/streamlit_report.py +137 -0
- siliconcompiler/report/streamlit_viewer.py +944 -0
- siliconcompiler/report/summary_image.py +117 -0
- siliconcompiler/report/summary_table.py +105 -0
- siliconcompiler/report/utils.py +163 -0
- siliconcompiler/scheduler/__init__.py +2092 -0
- siliconcompiler/scheduler/docker_runner.py +253 -0
- siliconcompiler/scheduler/run_node.py +138 -0
- siliconcompiler/scheduler/send_messages.py +178 -0
- siliconcompiler/scheduler/slurm.py +208 -0
- siliconcompiler/scheduler/validation/email_credentials.json +54 -0
- siliconcompiler/schema/__init__.py +7 -0
- siliconcompiler/schema/schema_cfg.py +4014 -0
- siliconcompiler/schema/schema_obj.py +1841 -0
- siliconcompiler/schema/utils.py +93 -0
- siliconcompiler/sphinx_ext/__init__.py +0 -0
- siliconcompiler/sphinx_ext/dynamicgen.py +1006 -0
- siliconcompiler/sphinx_ext/schemagen.py +221 -0
- siliconcompiler/sphinx_ext/utils.py +166 -0
- siliconcompiler/targets/__init__.py +0 -0
- siliconcompiler/targets/asap7_demo.py +68 -0
- siliconcompiler/targets/asic_demo.py +38 -0
- siliconcompiler/targets/fpgaflow_demo.py +47 -0
- siliconcompiler/targets/freepdk45_demo.py +59 -0
- siliconcompiler/targets/gf180_demo.py +77 -0
- siliconcompiler/targets/skywater130_demo.py +70 -0
- siliconcompiler/templates/email/general.j2 +66 -0
- siliconcompiler/templates/email/summary.j2 +43 -0
- siliconcompiler/templates/issue/README.txt +26 -0
- siliconcompiler/templates/issue/run.sh +6 -0
- siliconcompiler/templates/report/bootstrap.min.css +7 -0
- siliconcompiler/templates/report/bootstrap.min.js +7 -0
- siliconcompiler/templates/report/bootstrap_LICENSE.md +24 -0
- siliconcompiler/templates/report/sc_report.j2 +427 -0
- siliconcompiler/templates/slurm/run.sh +9 -0
- siliconcompiler/templates/tcl/manifest.tcl.j2 +137 -0
- siliconcompiler/tools/__init__.py +0 -0
- siliconcompiler/tools/_common/__init__.py +432 -0
- siliconcompiler/tools/_common/asic.py +115 -0
- siliconcompiler/tools/_common/sdc/sc_constraints.sdc +76 -0
- siliconcompiler/tools/_common/tcl/sc_pin_constraints.tcl +63 -0
- siliconcompiler/tools/bambu/bambu.py +32 -0
- siliconcompiler/tools/bambu/convert.py +77 -0
- siliconcompiler/tools/bluespec/bluespec.py +40 -0
- siliconcompiler/tools/bluespec/convert.py +103 -0
- siliconcompiler/tools/builtin/_common.py +155 -0
- siliconcompiler/tools/builtin/builtin.py +26 -0
- siliconcompiler/tools/builtin/concatenate.py +85 -0
- siliconcompiler/tools/builtin/join.py +27 -0
- siliconcompiler/tools/builtin/maximum.py +46 -0
- siliconcompiler/tools/builtin/minimum.py +57 -0
- siliconcompiler/tools/builtin/mux.py +70 -0
- siliconcompiler/tools/builtin/nop.py +38 -0
- siliconcompiler/tools/builtin/verify.py +83 -0
- siliconcompiler/tools/chisel/SCDriver.scala +10 -0
- siliconcompiler/tools/chisel/build.sbt +27 -0
- siliconcompiler/tools/chisel/chisel.py +37 -0
- siliconcompiler/tools/chisel/convert.py +140 -0
- siliconcompiler/tools/execute/exec_input.py +41 -0
- siliconcompiler/tools/execute/execute.py +17 -0
- siliconcompiler/tools/genfasm/bitstream.py +61 -0
- siliconcompiler/tools/genfasm/genfasm.py +40 -0
- siliconcompiler/tools/ghdl/convert.py +87 -0
- siliconcompiler/tools/ghdl/ghdl.py +41 -0
- siliconcompiler/tools/icarus/compile.py +87 -0
- siliconcompiler/tools/icarus/icarus.py +36 -0
- siliconcompiler/tools/icepack/bitstream.py +20 -0
- siliconcompiler/tools/icepack/icepack.py +43 -0
- siliconcompiler/tools/klayout/export.py +117 -0
- siliconcompiler/tools/klayout/klayout.py +119 -0
- siliconcompiler/tools/klayout/klayout_export.py +205 -0
- siliconcompiler/tools/klayout/klayout_operations.py +363 -0
- siliconcompiler/tools/klayout/klayout_show.py +242 -0
- siliconcompiler/tools/klayout/klayout_utils.py +176 -0
- siliconcompiler/tools/klayout/operations.py +194 -0
- siliconcompiler/tools/klayout/screenshot.py +98 -0
- siliconcompiler/tools/klayout/show.py +101 -0
- siliconcompiler/tools/magic/drc.py +49 -0
- siliconcompiler/tools/magic/extspice.py +19 -0
- siliconcompiler/tools/magic/magic.py +85 -0
- siliconcompiler/tools/magic/sc_drc.tcl +96 -0
- siliconcompiler/tools/magic/sc_extspice.tcl +54 -0
- siliconcompiler/tools/magic/sc_magic.tcl +47 -0
- siliconcompiler/tools/montage/montage.py +30 -0
- siliconcompiler/tools/montage/tile.py +66 -0
- siliconcompiler/tools/netgen/count_lvs.py +132 -0
- siliconcompiler/tools/netgen/lvs.py +90 -0
- siliconcompiler/tools/netgen/netgen.py +36 -0
- siliconcompiler/tools/netgen/sc_lvs.tcl +46 -0
- siliconcompiler/tools/nextpnr/apr.py +24 -0
- siliconcompiler/tools/nextpnr/nextpnr.py +59 -0
- siliconcompiler/tools/openfpgaloader/openfpgaloader.py +39 -0
- siliconcompiler/tools/openroad/__init__.py +0 -0
- siliconcompiler/tools/openroad/cts.py +45 -0
- siliconcompiler/tools/openroad/dfm.py +66 -0
- siliconcompiler/tools/openroad/export.py +131 -0
- siliconcompiler/tools/openroad/floorplan.py +70 -0
- siliconcompiler/tools/openroad/openroad.py +977 -0
- siliconcompiler/tools/openroad/physyn.py +27 -0
- siliconcompiler/tools/openroad/place.py +41 -0
- siliconcompiler/tools/openroad/rcx_bench.py +95 -0
- siliconcompiler/tools/openroad/rcx_extract.py +34 -0
- siliconcompiler/tools/openroad/route.py +45 -0
- siliconcompiler/tools/openroad/screenshot.py +60 -0
- siliconcompiler/tools/openroad/scripts/sc_apr.tcl +499 -0
- siliconcompiler/tools/openroad/scripts/sc_cts.tcl +64 -0
- siliconcompiler/tools/openroad/scripts/sc_dfm.tcl +20 -0
- siliconcompiler/tools/openroad/scripts/sc_export.tcl +98 -0
- siliconcompiler/tools/openroad/scripts/sc_floorplan.tcl +413 -0
- siliconcompiler/tools/openroad/scripts/sc_metrics.tcl +158 -0
- siliconcompiler/tools/openroad/scripts/sc_physyn.tcl +7 -0
- siliconcompiler/tools/openroad/scripts/sc_place.tcl +84 -0
- siliconcompiler/tools/openroad/scripts/sc_procs.tcl +423 -0
- siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +63 -0
- siliconcompiler/tools/openroad/scripts/sc_rcx_bench.tcl +20 -0
- siliconcompiler/tools/openroad/scripts/sc_rcx_extract.tcl +12 -0
- siliconcompiler/tools/openroad/scripts/sc_route.tcl +133 -0
- siliconcompiler/tools/openroad/scripts/sc_screenshot.tcl +21 -0
- siliconcompiler/tools/openroad/scripts/sc_write.tcl +5 -0
- siliconcompiler/tools/openroad/scripts/sc_write_images.tcl +361 -0
- siliconcompiler/tools/openroad/show.py +94 -0
- siliconcompiler/tools/openroad/templates/pex.tcl +8 -0
- siliconcompiler/tools/opensta/__init__.py +101 -0
- siliconcompiler/tools/opensta/report_libraries.py +28 -0
- siliconcompiler/tools/opensta/scripts/sc_procs.tcl +47 -0
- siliconcompiler/tools/opensta/scripts/sc_report_libraries.tcl +74 -0
- siliconcompiler/tools/opensta/scripts/sc_timing.tcl +268 -0
- siliconcompiler/tools/opensta/timing.py +214 -0
- siliconcompiler/tools/slang/__init__.py +49 -0
- siliconcompiler/tools/slang/lint.py +101 -0
- siliconcompiler/tools/surelog/__init__.py +123 -0
- siliconcompiler/tools/surelog/parse.py +183 -0
- siliconcompiler/tools/surelog/templates/output.v +7 -0
- siliconcompiler/tools/sv2v/convert.py +46 -0
- siliconcompiler/tools/sv2v/sv2v.py +37 -0
- siliconcompiler/tools/template/template.py +125 -0
- siliconcompiler/tools/verilator/compile.py +139 -0
- siliconcompiler/tools/verilator/lint.py +19 -0
- siliconcompiler/tools/verilator/parse.py +27 -0
- siliconcompiler/tools/verilator/verilator.py +172 -0
- siliconcompiler/tools/vivado/__init__.py +7 -0
- siliconcompiler/tools/vivado/bitstream.py +21 -0
- siliconcompiler/tools/vivado/place.py +21 -0
- siliconcompiler/tools/vivado/route.py +21 -0
- siliconcompiler/tools/vivado/scripts/sc_bitstream.tcl +6 -0
- siliconcompiler/tools/vivado/scripts/sc_place.tcl +2 -0
- siliconcompiler/tools/vivado/scripts/sc_route.tcl +4 -0
- siliconcompiler/tools/vivado/scripts/sc_run.tcl +45 -0
- siliconcompiler/tools/vivado/scripts/sc_syn_fpga.tcl +25 -0
- siliconcompiler/tools/vivado/syn_fpga.py +20 -0
- siliconcompiler/tools/vivado/vivado.py +147 -0
- siliconcompiler/tools/vpr/_json_constraint.py +63 -0
- siliconcompiler/tools/vpr/_xml_constraint.py +109 -0
- siliconcompiler/tools/vpr/place.py +137 -0
- siliconcompiler/tools/vpr/route.py +124 -0
- siliconcompiler/tools/vpr/screenshot.py +54 -0
- siliconcompiler/tools/vpr/show.py +88 -0
- siliconcompiler/tools/vpr/vpr.py +357 -0
- siliconcompiler/tools/xyce/xyce.py +36 -0
- siliconcompiler/tools/yosys/lec.py +56 -0
- siliconcompiler/tools/yosys/prepareLib.py +59 -0
- siliconcompiler/tools/yosys/sc_lec.tcl +84 -0
- siliconcompiler/tools/yosys/sc_syn.tcl +79 -0
- siliconcompiler/tools/yosys/syn_asic.py +565 -0
- siliconcompiler/tools/yosys/syn_asic.tcl +377 -0
- siliconcompiler/tools/yosys/syn_asic_fpga_shared.tcl +31 -0
- siliconcompiler/tools/yosys/syn_fpga.py +146 -0
- siliconcompiler/tools/yosys/syn_fpga.tcl +233 -0
- siliconcompiler/tools/yosys/syn_strategies.tcl +81 -0
- siliconcompiler/tools/yosys/techmaps/lcu_kogge_stone.v +39 -0
- siliconcompiler/tools/yosys/templates/abc.const +2 -0
- siliconcompiler/tools/yosys/yosys.py +147 -0
- siliconcompiler/units.py +259 -0
- siliconcompiler/use.py +177 -0
- siliconcompiler/utils/__init__.py +423 -0
- siliconcompiler/utils/asic.py +158 -0
- siliconcompiler/utils/showtools.py +25 -0
- siliconcompiler-0.26.5.dist-info/LICENSE +190 -0
- siliconcompiler-0.26.5.dist-info/METADATA +195 -0
- siliconcompiler-0.26.5.dist-info/RECORD +251 -0
- siliconcompiler-0.26.5.dist-info/WHEEL +5 -0
- siliconcompiler-0.26.5.dist-info/entry_points.txt +12 -0
- siliconcompiler-0.26.5.dist-info/top_level.txt +1 -0
siliconcompiler/units.py
ADDED
|
@@ -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
|