opencos-eda 0.2.36__py3-none-any.whl → 0.2.39__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.
opencos/tools/yosys.py CHANGED
@@ -5,6 +5,7 @@ Contains classes for ToolYosys
5
5
 
6
6
  # pylint: disable=R0801 # (calling functions with same arguments)
7
7
 
8
+ import os
8
9
  import shutil
9
10
  import subprocess
10
11
 
@@ -84,15 +85,44 @@ class CommonSynthYosys(CommandSynth, ToolYosys):
84
85
  ToolYosys.__init__(self, config=self.config)
85
86
 
86
87
  self.args.update({
88
+ 'sta': False,
89
+ 'liberty-file': '',
90
+ 'sdc-file': '',
87
91
  'yosys-synth': 'synth', # synth_xilinx, synth_altera, etc (see: yosys help)
88
92
  'yosys-pre-synth': ['prep', 'proc'], # command run in yosys prior to yosys-synth.
89
93
  'yosys-blackbox': [], # list of modules that yosys will blackbox.
90
94
  })
95
+ self.args_help.update({
96
+ 'sta': 'After running Yosys, run "sta" with --liberty-file.' \
97
+ + ' sta can be installed via: https://github.com/The-OpenROAD-Project/OpenSTA',
98
+ 'sdc-file': '.sdc file to use with --sta, if not present will use auto constraints',
99
+ 'liberty-file': 'Single liberty file for synthesis and sta,' \
100
+ + ' for example: github/OpenSTA/examples/nangate45_slow.lib.gz',
101
+ 'yosys-synth': 'The synth command provided to Yosys, see: yosys help.',
102
+ 'yosys-pre-synth': 'Yosys commands performed prior to running "synth"' \
103
+ + ' (or eda arg value for --yosys-synth)',
104
+ 'yosys-blackbox': 'List of modules that yosys will blackbox, likely will need these' \
105
+ + ' in Verilog-2001 for yosys to read outside of slang and synth',
106
+ })
107
+
108
+ self.yosys_out_dir = ''
109
+ self.yosys_v_path = ''
110
+ self.full_work_dir = ''
111
+ self.blackbox_list = []
91
112
 
92
113
  def do_it(self) -> None:
93
114
  self.set_tool_defines()
94
115
  self.write_eda_config_and_args()
95
116
 
117
+ # Set up some dirs and filenames.
118
+ self.full_work_dir = self.args.get('work-dir', '')
119
+ if not self.full_work_dir:
120
+ self.error(f'work_dir={self.full_work_dir} is not set')
121
+ self.full_work_dir = os.path.abspath(self.full_work_dir)
122
+ self.yosys_out_dir = os.path.join(self.full_work_dir, 'yosys')
123
+ util.safe_mkdir(self.yosys_out_dir)
124
+ self.yosys_v_path = os.path.join(self.yosys_out_dir, f'{self.args["top"]}.v')
125
+
96
126
  if self.is_export_enabled():
97
127
  self.do_export()
98
128
  return
@@ -102,3 +132,108 @@ class CommonSynthYosys(CommandSynth, ToolYosys):
102
132
  def write_and_run_yosys_f_files(self, **kwargs) -> None:
103
133
  '''Derived classes must define, to run remainder of do_it() steps'''
104
134
  raise NotImplementedError
135
+
136
+
137
+ def create_yosys_synth_f(self) -> util.ShellCommandList:
138
+ '''Derived classes may define, if they wish to get a list of yosys commands'''
139
+ return util.ShellCommandList([])
140
+
141
+
142
+ def get_synth_command_lines(self) -> list:
143
+ '''Common yosys tcl after all blackbox and read_verilog commands'''
144
+
145
+ lines = []
146
+ lines += self.args.get('yosys-pre-synth', [])
147
+
148
+ synth_command = self.args.get('yosys-synth', 'synth')
149
+ if self.args['flatten-all']:
150
+ synth_command += ' -flatten'
151
+
152
+ lines.append(synth_command)
153
+
154
+
155
+ # TODO(drew): I need a blackbox flow here? Or a memory_libmap?
156
+ # --> https://yosyshq.readthedocs.io/projects/yosys/en/latest/cmd/memory_libmap.html
157
+ # TODO(drew): can I run multiple liberty files?
158
+ if self.args['liberty-file']:
159
+ lines += [
160
+ 'dfflibmap -liberty ' + self.args['liberty-file'],
161
+ #'memory_libmap -lib ' + self.args['liberty-file'], # Has to be unzipped?
162
+ 'abc -liberty ' + self.args['liberty-file'],
163
+ ]
164
+ lines += [
165
+ 'opt_clean',
166
+ f'write_verilog {self.yosys_v_path}',
167
+ f'write_json {self.yosys_v_path}.json',
168
+ ]
169
+ return lines
170
+
171
+
172
+ def create_sta_f(self) -> util.ShellCommandList:
173
+ '''Returns command list, for running 'sta' on sta.f'''
174
+
175
+ if not self.args['sta']:
176
+ return []
177
+
178
+ if not self.args['liberty-file']:
179
+ self.error('--sta is set, but need to also set --liberty-file=<file>')
180
+
181
+ if self.args['sdc-file']:
182
+ if not os.path.exists(self.args['sdc-file']):
183
+ self.error(f'--sdc-file={self.args["sdc-file"]} file does not exist')
184
+
185
+ if not self.sta_exe:
186
+ self.error(f'--sta is set, but "sta" was not found in PATH, see: {self._URL}')
187
+
188
+ sta_command_list = util.ShellCommandList(
189
+ [ self.sta_exe, '-no_init', '-exit', 'sta.f' ],
190
+ tee_fpath = 'sta.log'
191
+ )
192
+
193
+ # Need to create sta.f:
194
+ if self.args['sdc-file']:
195
+ sdc_path = self.args['sdc-file']
196
+ else:
197
+ # Need to create sdc.f:
198
+ sdc_path = 'sdc.f'
199
+ self.create_sdc_f()
200
+
201
+ with open(os.path.join(self.args['work-dir'], 'sta.f'), 'w',
202
+ encoding='utf-8') as f:
203
+ lines = [
204
+ 'read_liberty ' + self.args['liberty-file'],
205
+ 'read_verilog ' + self.yosys_v_path,
206
+ 'link_design ' + self.args['top'],
207
+ 'read_sdc ' + sdc_path,
208
+ 'report_checks',
209
+ ]
210
+ f.write('\n'.join(lines))
211
+
212
+ return util.ShellCommandList(
213
+ sta_command_list,
214
+ tee_fpath = 'sta.log'
215
+ )
216
+
217
+
218
+ def create_sdc_f(self) -> None:
219
+ '''Returns None, creates sdc.f'''
220
+
221
+ if self.args['sdc-file']:
222
+ # already exists from args, return b/c nothing to create.
223
+ return
224
+
225
+ with open(os.path.join(self.args['work-dir'], 'sdc.f'), 'w',
226
+ encoding='utf-8') as f:
227
+ clock_name = self.args['clock-name']
228
+ period = self.args['clock-ns']
229
+ name_not_equal_clocks_str = f'NAME !~ "{clock_name}"'
230
+ lines = [
231
+ f'create_clock -add -name {clock_name} -period {period} [get_ports ' \
232
+ + '{' + clock_name + '}];',
233
+ f'set_input_delay -max {self.args["idelay-ns"]} -clock {clock_name}' \
234
+ + ' [get_ports * -filter {DIRECTION == IN && ' \
235
+ + name_not_equal_clocks_str + '}];',
236
+ f'set_output_delay -max {self.args["odelay-ns"]} -clock {clock_name}' \
237
+ + ' [get_ports * -filter {DIRECTION == OUT}];',
238
+ ]
239
+ f.write('\n'.join(lines))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencos-eda
3
- Version: 0.2.36
3
+ Version: 0.2.39
4
4
  Summary: A simple Python package for wrapping RTL simuliatons and synthesis
5
5
  Author-email: Simon Sabato <simon@cognichip.ai>, Drew Ranck <drew@cognichip.ai>
6
6
  Project-URL: Homepage, https://github.com/cognichip/opencos
@@ -3,44 +3,45 @@ opencos/_version.py,sha256=qN7iBoOv-v4tEZz-Pu9sVUJwefshJOsgdaddn8HcHio,510
3
3
  opencos/_waves_pkg.sv,sha256=1lbhQOVGc3t_R8czYjP40hssP0I3FlZOpHTkI7yKFbI,1251
4
4
  opencos/deps_helpers.py,sha256=Pgo3dO_QBHzGB0lE2B0uf2vWWDy3dSDN0pvW-eA6ocs,56939
5
5
  opencos/deps_schema.py,sha256=MhytzXwp071F14RwxqHt78ak8Qruoe4FeK5XSzkO2f0,14658
6
- opencos/eda.py,sha256=NCsSAnWANumzP2EzlsT-TvGUEuY8ONpHo-cvTcWC2wM,21261
7
- opencos/eda_base.py,sha256=Fi21IIKvYIzyj_vQtaqPwrUXDaszfIixoB80-TQMM2k,77455
8
- opencos/eda_config.py,sha256=CXfFVW4QOtP1gpMcX8JhCe93_aibcdbGoS7RAiYQnOs,8561
9
- opencos/eda_config_defaults.yml,sha256=4ryY9THfaeL2kclo5KLkC7F1_g7FbjVzDMQFdAsvTl0,9195
6
+ opencos/eda.py,sha256=k0_7ppBBPFsQ8Jd0mJGOnc6llUNo2hryHwx8DZ_B_jU,18832
7
+ opencos/eda_base.py,sha256=hpkcylto5V4WUZkA-R39ZeB3aKFplTuX82eX7d1gUbk,81657
8
+ opencos/eda_config.py,sha256=FVp-dg9IVq78LZoh43kFYo9WXKfFxsMQMo6JGulEbEM,8818
9
+ opencos/eda_config_defaults.yml,sha256=0tqs4paxCYZJshb2WW2GfaZyeh_l9ZUKWMh8hh17AWk,10235
10
10
  opencos/eda_config_max_verilator_waivers.yml,sha256=lTAU4IOEbUWVlPzuer1YYhIyxpPINeA4EJqcRIT-Ymk,840
11
- opencos/eda_config_reduced.yml,sha256=2mV9CiUEj_tyJnQsC9_k0RlxuBrky0zW1HX2xlDVEjU,1469
12
- opencos/eda_deps_bash_completion.bash,sha256=BmCZNnRBioiPf93qwjtOmIPdDeHes0ojS_s_k4jhMoo,1950
13
- opencos/eda_extract_targets.py,sha256=Qc4IEx82ZNY2bLNYY0htpB4XLT-Mr2JQfPriyRigWkI,3467
11
+ opencos/eda_config_reduced.yml,sha256=cQ9jY4J7EvAbeHTiP6bvpDSVJAYiitjLZPSxxLKIEbk,1440
12
+ opencos/eda_deps_bash_completion.bash,sha256=jMkQKY82HBgOnQeMdA1hMrXguRFtB52SMBxUemKovL4,1958
13
+ opencos/eda_extract_targets.py,sha256=LLf8pGia0HxqXQFRck0E990EchbEdiFTC1fQyA8FZqs,4101
14
14
  opencos/eda_tool_helper.py,sha256=MxNd_ImyA13DZbzMol1R5H8tJZddJfqyDgFVR2ad374,1666
15
15
  opencos/export_helper.py,sha256=2SfzHM3m6b5Wh-OMgRWv5I_A95MHIYBn8-H_P3YC7ZQ,19680
16
16
  opencos/export_json_convert.py,sha256=KsP1ESmSWs8ouecDC5ikuwOFZNJtLjmiYOvYLeN5UZU,3768
17
- opencos/files.py,sha256=IB-hTRrVQx884GNqdJX1V1ikSRUS1Vwu-B3yX0AN6FI,1495
17
+ opencos/files.py,sha256=z7HYk5j7cMyjK8e25xzCyyUzOnj9iZt9IpGJibbbh-U,1495
18
18
  opencos/names.py,sha256=LMhAE5UH5LEy4zqHp3rOe6tP26i_Dka6JOJzKMo_bkg,1201
19
19
  opencos/oc_cli.py,sha256=kj2OXvgxli2WPj4MQ4zTBb36eFtsP2gsqDdeNeWGL4E,132108
20
20
  opencos/pcie.py,sha256=VUJljaZJYgScAAx5yn7F6GoA8K9eTcw24otYZbkMpYs,3035
21
21
  opencos/peakrdl_cleanup.py,sha256=vLhSOVs6cEzsi_PwAP4pSXu5_ZMZjDvfK_WmHDLbDac,486
22
22
  opencos/seed.py,sha256=8TA2uXhBuT_lOaQdAKqdReYvfBWi_KuyQCFJzA2rOVM,549
23
23
  opencos/util.py,sha256=3rADW0tUzq69wdHsa2GB060N1jCAK2Dk0NLx6N6BMcc,27861
24
- opencos/commands/__init__.py,sha256=cHermtb27ZOUurW1UIGarQIJihH1oJvpFWwUbk6q2i0,858
24
+ opencos/commands/__init__.py,sha256=d-8heMkBjjm6_yeduZgUv34lPfHVpj9MWP1ifpdjJws,916
25
25
  opencos/commands/build.py,sha256=jI5ul53qfwn6X-yfSdSQIcLBhGtzZUk7r_wKBBmKJI0,1425
26
26
  opencos/commands/elab.py,sha256=m6Gk03wSzX8UkcmReooK7turF7LpqO0IcdOZwJ8XiyI,1596
27
27
  opencos/commands/export.py,sha256=uGDI5_lUhyNB54gFjm9cWv9g_3waEOJN4wOC01oFlCY,3535
28
28
  opencos/commands/flist.py,sha256=rylcisH3X6UZGQY8WkSGHHIYWKi6o-JwtITz7gflsbY,8460
29
- opencos/commands/multi.py,sha256=__UF5If4WIY_9044gcGEQiU8MTGPro-q3kzQ4v0PMdI,26283
29
+ opencos/commands/multi.py,sha256=1IH5Bk5xnKsNvtEsYy8a6bFmcyHSfrMVK-lLNdj6vlg,26449
30
30
  opencos/commands/open.py,sha256=unrpGckzg0FE5W3oARq8x0jX7hhV_uM9Oh5FgISHFAg,724
31
31
  opencos/commands/proj.py,sha256=MdHTOtQYG93_gT97dWuSyAgUxX2vi9FRhL0dtc-rM98,1096
32
32
  opencos/commands/sim.py,sha256=phATz_wR0BAH6B_IJ4zyzg_Hptp5hSEOe_-9NLaL_bY,14058
33
- opencos/commands/sweep.py,sha256=L4AYF3vQHR-fi0871f1CwrD0y4tydrsNpWSDjVf1xIA,8719
33
+ opencos/commands/sweep.py,sha256=O0VSpzHHlE_1hM-Edp4d80PAnh2P2HCIwsGLnhkRHWM,9107
34
34
  opencos/commands/synth.py,sha256=quB-HWS4LKYTiFBHiYarQi4pMnRmt12wQTZpi14VvlE,4355
35
+ opencos/commands/targets.py,sha256=_jRNhm2Fqj0fmMvTw6Ba39DCsRHf_r_uZCy_R064kpA,1472
35
36
  opencos/commands/upload.py,sha256=nlb4nlxrDCQPcabEmH3nP19g4PFILDqFDab4LwJ95Z4,796
36
37
  opencos/commands/waves.py,sha256=SRfjfsqhuszXHylQrgqYiUT3a5CQs9doxJQzuV4Ae0w,7055
37
38
  opencos/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
39
  opencos/tests/custom_config.yml,sha256=TRoVM9ZFKPOA_8JmlpzaMhnGO1txmaD14N_8P1oqzew,257
39
- opencos/tests/helpers.py,sha256=M_XwM1vQmcrVEgfvpL7C23VPjiFhPpsCqhAH5ZZqAT4,8211
40
+ opencos/tests/helpers.py,sha256=zzQQP8ZeNUwrvJRQVlpTnvz9yxFG0Jfuss50ZPjxa-c,8240
40
41
  opencos/tests/test_build.py,sha256=FQAxOpLVQShAHD_L5rqJctPeSAoqoOCNFI0RXflLuY0,387
41
42
  opencos/tests/test_deps_helpers.py,sha256=_nJSgLN6WVlMKqu6sCr29gjQyN3Jj-dVk8Ac64ygpJs,5928
42
43
  opencos/tests/test_deps_schema.py,sha256=mWTWI4wriGXC8UAnaeq_MIvWJOvf08-fPUqUgELptQ4,896
43
- opencos/tests/test_eda.py,sha256=HCUGCg9yVILIIyyey2XArllgtBV5XHeVVnL5AGglO7I,37786
44
+ opencos/tests/test_eda.py,sha256=eraWvyJJHrlq4CVoeWakYckRG8RRUYtecJRzlcXX45Q,38545
44
45
  opencos/tests/test_eda_elab.py,sha256=75bJpOaoO8rn1FXFxiE4KSu5FdjZP1IbW6SyTCjM_ao,2553
45
46
  opencos/tests/test_eda_synth.py,sha256=C_1LzblTuK_lHFv_Hh8v3DKUN4hGfxoChYR77GricX4,2871
46
47
  opencos/tests/test_oc_cli.py,sha256=-ZmwVX_CPBXCGT9hXIBEr_XUSIGG2eky89YpSJIbRAg,731
@@ -53,23 +54,23 @@ opencos/tests/deps_files/non_sv_reqs/DEPS.yml,sha256=VZkahO1AKhD9GUV5lK8VwUONEi5
53
54
  opencos/tests/deps_files/tags_with_tools/DEPS.yml,sha256=-5U1qfJElgpVhmkLEu3lYuvDYva8kDlt6JOdB9jidmc,1377
54
55
  opencos/tests/deps_files/test_err_fatal/DEPS.yml,sha256=GnXIUJvshQWR9PlYxX67T53ejf5KhDbtD8sUJB4Rwd0,95
55
56
  opencos/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
- opencos/tools/invio.py,sha256=xAkYkMFKIUZDU1PkHeydDuPFjpEF_TN-1uYv7ErH4hY,3296
57
+ opencos/tools/invio.py,sha256=q9E9n6xsozDfar-1rLvJEZbCpPb_bQEy6WKEI3KS3dk,3163
57
58
  opencos/tools/invio_helpers.py,sha256=1au4CYmV5aC7DHjaZBNemydH6Eq0i-Yt5L3HyKfQOfY,7638
58
- opencos/tools/invio_yosys.py,sha256=a7GGuPgxyilves_EjE1DSZqetPr7n0fcQC-xxrzjqag,5714
59
- opencos/tools/iverilog.py,sha256=1SmkJAtG096ozIY6N19UtpD-YT1UKJAcMLJ9blfraP0,6413
60
- opencos/tools/modelsim_ase.py,sha256=x5xFWBNaln2lVLixN0Od0uNaLKN_Bt1q6a91QmhKoNA,13162
59
+ opencos/tools/invio_yosys.py,sha256=4zWBeFKXHSyb5WSnf6ZpVG2UwoKF0SC-00I1_VqgXZM,6016
60
+ opencos/tools/iverilog.py,sha256=oPaR654-3EHjyb6_r9Nj9VVaHrDAX7kSKztBAQRvNHU,6502
61
+ opencos/tools/modelsim_ase.py,sha256=Y2Y-xC3ktby6z-dE3iipuqPkNl8eCmdi2Hb9mcwJTHA,13218
61
62
  opencos/tools/questa.py,sha256=AX_3USyf6eMcssH4b-8WLbCzz-cXYnQzlHvCyL9C7Og,7505
62
63
  opencos/tools/slang.py,sha256=74EDAAnN7mrrYxgxaPDaoRJZK7Se9B_HsW8Ioi2Nw44,7425
63
- opencos/tools/slang_yosys.py,sha256=8zLwScd3PjouuLQpLvpX837kGqYQiJ9bnButCwrmSqI,15047
64
+ opencos/tools/slang_yosys.py,sha256=mw4AfutGjKyCj7NLrHDy2j3p0XC2H7uuBf9RkVQJYoQ,9856
64
65
  opencos/tools/surelog.py,sha256=JOMs8SqnzJ_ZL5mEdyyn3Z1r1Kc8hfbV3Pnen1YzxWA,4980
65
66
  opencos/tools/tabbycad_yosys.py,sha256=h9kkAi479cZzYfb4R9WBNY_JmR6BgVFj4s3VShnGpoA,7813
66
- opencos/tools/verilator.py,sha256=0ZHAkkUqnsM1A4B8-u6tff3lhl-cgfDUx-Dq7DaRwkI,18080
67
- opencos/tools/vivado.py,sha256=cL5IZdudqquddvZqHQGDVmaHSxgBZsMUmAq18q8AgoM,39134
68
- opencos/tools/yosys.py,sha256=Nov3zKyliZ6rHwMbH4f8XEkoo9H66T2-MN-KNQTjWFk,3530
69
- opencos_eda-0.2.36.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
70
- opencos_eda-0.2.36.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
71
- opencos_eda-0.2.36.dist-info/METADATA,sha256=bcp36pjsJ-jZgB8xXIiaYRKT86yOHYl_cBgKHaMVDDI,604
72
- opencos_eda-0.2.36.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
73
- opencos_eda-0.2.36.dist-info/entry_points.txt,sha256=V8OE1lySAFcFQpDNJuVxVZteeSmDH-joLMhGvrxrvmg,164
74
- opencos_eda-0.2.36.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
75
- opencos_eda-0.2.36.dist-info/RECORD,,
67
+ opencos/tools/verilator.py,sha256=lxR7BSmeTc6YcL0UuXzIfJk7umVm8RfbU8rtYtbKUBg,18192
68
+ opencos/tools/vivado.py,sha256=1dbQ-5oUUaUNIeMp07HArWG15spG81OuCwJ88qRNXU0,39102
69
+ opencos/tools/yosys.py,sha256=aZnRFbsODYRe4BHbfxl6vfWeEP7WJYJk50gCZcn8Fu0,8902
70
+ opencos_eda-0.2.39.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
71
+ opencos_eda-0.2.39.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
72
+ opencos_eda-0.2.39.dist-info/METADATA,sha256=C0mlmBaoqZTDtiqGpFH68SsN-i_XBG8505L2MIiUXcE,604
73
+ opencos_eda-0.2.39.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
74
+ opencos_eda-0.2.39.dist-info/entry_points.txt,sha256=V8OE1lySAFcFQpDNJuVxVZteeSmDH-joLMhGvrxrvmg,164
75
+ opencos_eda-0.2.39.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
76
+ opencos_eda-0.2.39.dist-info/RECORD,,