opencos-eda 0.3.2__py3-none-any.whl → 0.3.3__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.
@@ -145,6 +145,7 @@ tools:
145
145
  --timescale=1ns/1ns
146
146
  --allow-dup-initial-drivers
147
147
  -Wno-missing-top
148
+ compile-waivers: []
148
149
 
149
150
  verilator:
150
151
  defines: { }
@@ -153,11 +154,11 @@ tools:
153
154
  - "%Fatal"
154
155
  log-must-strings:
155
156
  - "R e p o r t: Verilator" # These come at end of compile or simulation, since we don't suppress it.
157
+ # Note: -j $(nproc) is handled in verilator.py, but you can override it in compile-args
156
158
  compile-args: |
157
159
  --timing
158
160
  --assert
159
161
  --autoflush
160
- -j 2
161
162
  -sv
162
163
  compile-coverage-args: |
163
164
  --coverage
opencos/tests/helpers.py CHANGED
@@ -242,7 +242,9 @@ class Helpers:
242
242
 
243
243
  return rc
244
244
 
245
- def is_in_log(self, *want_str, logfile=None, windows_path_support=False):
245
+ def is_in_log(
246
+ self, *want_str, logfile=None, windows_path_support: bool = False
247
+ ) -> bool:
246
248
  '''Check if want_str (joined) is in the logfile, or self.DEFAULT_LOG'''
247
249
  logfile = self._resolve_logfile(logfile)
248
250
  want_str0 = ' '.join(list(want_str))
@@ -254,7 +256,9 @@ class Helpers:
254
256
  return True
255
257
  return False
256
258
 
257
- def get_log_lines_with(self, *want_str, logfile=None, windows_path_support=False):
259
+ def get_log_lines_with(
260
+ self, *want_str, logfile=None, windows_path_support: bool = False
261
+ ) -> list:
258
262
  '''gets all log lines with any of want_str args are in the logfile, or self.DEFAULT_LOG'''
259
263
  logfile = self._resolve_logfile(logfile)
260
264
  ret_list = []
@@ -267,6 +271,21 @@ class Helpers:
267
271
  ret_list.append(line)
268
272
  return ret_list
269
273
 
274
+ def get_log_lines_with_all(
275
+ self, *want_str, logfile=None, windows_path_support: bool = False
276
+ ) -> list:
277
+ '''gets all log lines with ALL of want_str args are in the logfile, or self.DEFAULT_LOG'''
278
+ logfile = self._resolve_logfile(logfile)
279
+ ret_list = []
280
+ with open(logfile, encoding='utf-8') as f:
281
+ for line in f.readlines():
282
+ if all(x in line for x in list(want_str)):
283
+ ret_list.append(line)
284
+ elif windows_path_support and \
285
+ all(x.replace('/', '\\') in line for x in list(want_str)):
286
+ ret_list.append(line)
287
+ return ret_list
288
+
270
289
  def get_log_words_with(self, *want_str, logfile=None, windows_path_support=False):
271
290
  '''gets all log words with any of *want_str within a single word
272
291
  in the logfile or self.DEFAULT_LOG
opencos/tools/slang.py CHANGED
@@ -128,6 +128,7 @@ class CommandElabSlang(CommandElab, ToolSlang):
128
128
  command_list += self.tool_config.get('compile-args', '--single-unit').split()
129
129
  command_list += self.args['slang-args'] # add user args.
130
130
  command_list += self._get_slang_json_args(command_exe=command_list[0])
131
+ command_list += self._get_slang_tool_config_waivers()
131
132
 
132
133
  # incdirs
133
134
  for value in self.incdirs:
@@ -214,6 +215,11 @@ class CommandElabSlang(CommandElab, ToolSlang):
214
215
 
215
216
  return command_list
216
217
 
218
+ def _get_slang_tool_config_waivers(self) -> list:
219
+ # Add compile waivers from config and command-line args
220
+ return [f'-Wno-{waiver}' for waiver in
221
+ self.tool_config.get('compile-waivers', []) + self.args['compile-waivers']]
222
+
217
223
 
218
224
  class CommandLintSlang(CommandElabSlang):
219
225
  '''CommandLintSlang is a command handler for: eda lint --tool=slang.'''
@@ -5,10 +5,12 @@ Contains classes for ToolVerilator and VerilatorSim, VerilatorElab.
5
5
 
6
6
  # pylint: disable=R0801 # (calling functions with same arguments)
7
7
 
8
+ import multiprocessing
8
9
  import os
9
10
  import shutil
10
11
  import subprocess
11
12
 
13
+
12
14
  from opencos import util
13
15
  from opencos.eda_base import Tool
14
16
  from opencos.commands import CommandSim
@@ -210,15 +212,9 @@ class VerilatorSim(CommandSim, ToolVerilator):
210
212
 
211
213
  verilate_command_list = self._get_start_verilator_command_list(lint_only=lint_only)
212
214
 
213
- # Add compile args from our self.config (tools.verilator.compile-args str)
214
- config_compile_args = self.tool_config.get(
215
- 'compile-args',
216
- '--timing --assert --autoflush -sv').split()
217
- verilate_command_list += config_compile_args
218
-
219
215
  verilate_command_list += self._get_verilator_tool_config_waivers()
220
216
 
221
- verilate_command_list += self._verilator_args_deal_with_cflags()
217
+ verilate_command_list += self._verilator_args_defaults_cflags_nproc()
222
218
 
223
219
  verilate_command_list += self._get_verilator_waves_args(lint_only=lint_only)
224
220
 
@@ -425,45 +421,51 @@ class VerilatorSim(CommandSim, ToolVerilator):
425
421
  return ret
426
422
 
427
423
 
428
- def _verilator_args_deal_with_cflags(self) -> list:
424
+ def _verilator_args_defaults_cflags_nproc(self) -> list:
429
425
  '''Returns list of args to be added to verilator (compile) step
430
426
 
431
- Uses self.args['verilate-args'] and self.args['compile-args']
427
+ Uses self.args['verilate-args'], self.args['compile-args'], and self.tool_config
428
+
429
+ Sets -j <value> and -CFLAGS -O<value> if not present in --config-yml, --compile-args,
430
+ or --verilate-args. If present, chooses the first instance (does not present duplicates
431
+ to verilator call).
432
432
  '''
433
433
 
434
- # We can only support one -CFLAGS followed by one -O[0-9] arg in self.args['verilate-args']:
435
- verilate_cflags_args_dict = {}
436
- verilate_args = [] # will be combined verilate_args + compile-args
437
- prev_arg_is_cflags = False
434
+ # We can only support one -CFLAGS followed by one -O[0-9] arg in
435
+ # --verilate-args or --compile-args.
436
+
437
+ # Add compile args from our self.config (tools.verilator.compile-args str)
438
+ verilate_args = self.args['verilate-args'] + \
439
+ self.args['compile-args'] + \
440
+ self.tool_config.get(
441
+ 'compile-args',
442
+ '--timing --assert --autoflush -sv').split()
443
+
438
444
  util.debug(f"{self.args['verilate-args']=}")
439
445
  util.debug(f"{self.args['compile-args']=}")
440
- for arg in self.args['verilate-args'] + self.args['compile-args']:
441
- # pick the first ones we see of these:
442
- if arg == '-CFLAGS':
443
- prev_arg_is_cflags = True
444
- if arg not in verilate_cflags_args_dict:
445
- # We can only have 1
446
- verilate_cflags_args_dict[arg] = True
447
- verilate_args.append(arg)
448
- else:
449
- util.debug(f'Previous saw -CFLAGS args {verilate_cflags_args_dict=},',
450
- f'skipping new {arg=}')
451
-
452
- elif arg.startswith('-O') and len(arg) == 3:
453
- if '-O' not in verilate_cflags_args_dict and prev_arg_is_cflags:
454
- # We can only have 1
455
- verilate_cflags_args_dict['-O'] = arg[-1]
456
- verilate_args.append(arg)
457
- else:
458
- util.debug(f'Previous saw -CFLAGS args {verilate_cflags_args_dict=},',
459
- f'skipping new {arg=}')
460
- prev_arg_is_cflags = False
461
-
462
- else:
463
- prev_arg_is_cflags = False
464
- verilate_args.append(arg)
465
446
 
466
- if '-CFLAGS' in verilate_args:
447
+ dash_j_arg_indices = []
448
+ cflags_dasho_args_indices = []
449
+ for i, arg in enumerate(list(verilate_args)):
450
+ # There can only be one of these: -j <value>, similarly can only be one of
451
+ # -CFLAGS -O<value>
452
+ if (i + 1) < len(verilate_args):
453
+ if arg == '-j':
454
+ dash_j_arg_indices.extend([i, i + 1])
455
+ if arg == '-CFLAGS':
456
+ next_arg = verilate_args[i + 1]
457
+ if next_arg.startswith('-O') and len(next_arg) == 3:
458
+ cflags_dasho_args_indices.extend([i, i + 1])
459
+
460
+ # For -j <value> we'll pick the first one, remove the rest.
461
+ # Same goes for -CFLAGS -O<value>
462
+ for index in dash_j_arg_indices[2:] + cflags_dasho_args_indices[2:]:
463
+ verilate_args[index] = ''
464
+
465
+ verilate_args = [x for x in verilate_args if x != ''] # strip empty str.
466
+
467
+ # Support for --optimize which will use -CFLAGS -O3, if -CFLAGS is not present at all.
468
+ if cflags_dasho_args_indices:
467
469
  # add whatever args were passed via 'compile-args' or 'verilate_args'. Note these will
468
470
  # take precedence over the --optimize arg.
469
471
  pass
@@ -472,8 +474,15 @@ class VerilatorSim(CommandSim, ToolVerilator):
472
474
  # (slower compile, better runtime)
473
475
  verilate_args += '-CFLAGS', '-O3'
474
476
  else:
477
+ # Default to -O1:
475
478
  verilate_args += '-CFLAGS', '-O1'
476
479
 
480
+ # If there was no -j setting, then use max(2, $(nproc) - 1)
481
+ if not dash_j_arg_indices:
482
+ nproc = max(2, multiprocessing.cpu_count() - 1)
483
+ verilate_args += '-j', f'{nproc}'
484
+
485
+
477
486
  return verilate_args
478
487
 
479
488
 
opencos/util.py CHANGED
@@ -18,6 +18,7 @@ from enum import Enum
18
18
  from pathlib import Path
19
19
  from importlib import import_module
20
20
  from dotenv import load_dotenv
21
+ from supports_color import supportsColor
21
22
 
22
23
  from opencos.utils import status_constants
23
24
 
@@ -29,7 +30,7 @@ dot_f_files_expanded = set() # pylint: disable=invalid-name
29
30
  env_files_loaded = set() # pylint: disable=invalid-name
30
31
 
31
32
  args = { # pylint: disable=invalid-name
32
- 'color' : False,
33
+ 'color' : bool(supportsColor.stdout),
33
34
  'quiet' : False,
34
35
  'verbose' : False,
35
36
  'debug' : False,
@@ -351,13 +352,14 @@ def get_argparser() -> argparse.ArgumentParser:
351
352
  bool_action_kwargs = get_argparse_bool_action_kwargs()
352
353
 
353
354
  parser.add_argument('--version', default=False, action='store_true')
354
- parser.add_argument('--color', **bool_action_kwargs, default=True,
355
+ parser.add_argument('--color', **bool_action_kwargs, default=bool(supportsColor.stdout),
355
356
  help='Use shell colors for info/warning/error messaging')
356
- parser.add_argument('--quiet', **bool_action_kwargs, help='Do not display info messaging')
357
- parser.add_argument('--verbose', **bool_action_kwargs,
357
+ parser.add_argument('--quiet', **bool_action_kwargs, default=args['quiet'],
358
+ help='Do not display info messaging')
359
+ parser.add_argument('--verbose', **bool_action_kwargs, default=args['verbose'],
358
360
  help='Display additional messaging level 2 or higher')
359
- parser.add_argument('--fancy', **bool_action_kwargs)
360
- parser.add_argument('--debug', **bool_action_kwargs,
361
+ parser.add_argument('--fancy', **bool_action_kwargs, default=args['fancy'])
362
+ parser.add_argument('--debug', **bool_action_kwargs, default=args['debug'],
361
363
  help='Display additional debug messaging level 1 or higher')
362
364
  parser.add_argument('--debug-level', type=int, default=0,
363
365
  help='Set debug level messaging (default: 0)')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencos-eda
3
- Version: 0.3.2
3
+ Version: 0.3.3
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
@@ -17,4 +17,5 @@ Requires-Dist: toml>=0.10.2
17
17
  Requires-Dist: yamllint>=1.35.1
18
18
  Requires-Dist: PySerial>=3.5
19
19
  Requires-Dist: cocotb>=2.0
20
+ Requires-Dist: supports_color>=0.2.0
20
21
  Dynamic: license-file
@@ -5,7 +5,7 @@ opencos/deps_schema.py,sha256=VUdXuq43mKfM-U4x7DSA28-MH1Xqxre6V7Ttw2DeOqI,16762
5
5
  opencos/eda.py,sha256=91E-EsyZS-uRadApP-h2onW6rpvLBnrpJoT_9tRtsS8,23322
6
6
  opencos/eda_base.py,sha256=jf4t11UPj39swL41z-EJiGTOnHvRScaQc-SAjpZ5XI4,109651
7
7
  opencos/eda_config.py,sha256=z3yQOPGBX7-yKp6BdQYfJ9eOJf-Jctl-mwCDj3vj2BI,12712
8
- opencos/eda_config_defaults.yml,sha256=LF0yAncYeaPtZIoAfEeo2aiDXT4cjYa99soGks0WRzM,16063
8
+ opencos/eda_config_defaults.yml,sha256=Bs9UyXckIpauK_tf27iRkig6hBvsuI-PL7HhgCQpA1k,16168
9
9
  opencos/eda_config_max_verilator_waivers.yml,sha256=lTAU4IOEbUWVlPzuer1YYhIyxpPINeA4EJqcRIT-Ymk,840
10
10
  opencos/eda_config_reduced.yml,sha256=cQ9jY4J7EvAbeHTiP6bvpDSVJAYiitjLZPSxxLKIEbk,1440
11
11
  opencos/eda_deps_bash_completion.bash,sha256=jMkQKY82HBgOnQeMdA1hMrXguRFtB52SMBxUemKovL4,1958
@@ -18,7 +18,7 @@ opencos/files.py,sha256=AQOnsrvoc0r76LiFrkoMbwOGdUO1FpBiFY_jyyI_ve8,1566
18
18
  opencos/names.py,sha256=Y2aJ5wgpbNIJ-_P5xUXnHMv_h-zMOX2Rt6iLuduqC1Q,1213
19
19
  opencos/peakrdl_cleanup.py,sha256=vHNGtalTrIVP335PhRjPt9RhoccgpK1HJAi-E4M8Kc8,736
20
20
  opencos/seed.py,sha256=IL9Yg-r9SLSRseMVWaEHmuw2_DNi_eyut11EafoNTsU,942
21
- opencos/util.py,sha256=ffaSoDDOsL6mx_fYgAyJA8fawsxZ5YHKqs67b8iW5rw,41921
21
+ opencos/util.py,sha256=tgDOvkIGCPfuuJmP1nMsxsxaxmhlH9DOUsJ3SVjtXy4,42123
22
22
  opencos/commands/__init__.py,sha256=oOOQmn5_jHAMSOfA3swJJ7mdoyHsJA0lJwKPTudlTns,1125
23
23
  opencos/commands/build.py,sha256=mvJYxk5J15k0Cr8R7oIdIIdsEtWV3gE-LnPweVwtSDo,1487
24
24
  opencos/commands/deps_help.py,sha256=WDrU7H9sypzDAxe_CHqhW5B_scbQMzBEdf-v-Jcfd5Q,10682
@@ -47,7 +47,7 @@ opencos/hw/oc_cli.py,sha256=U1JGlshLZhtd0LgndZFBZVltAj_HemdhbjO_Zo8ZuVM,132252
47
47
  opencos/hw/pcie.py,sha256=VUJljaZJYgScAAx5yn7F6GoA8K9eTcw24otYZbkMpYs,3035
48
48
  opencos/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
49
  opencos/tests/custom_config.yml,sha256=TRoVM9ZFKPOA_8JmlpzaMhnGO1txmaD14N_8P1oqzew,257
50
- opencos/tests/helpers.py,sha256=wkEzYRt78B4b7Qni2GoWcncrhWjZ3nLhDMHtPYvvW8w,11725
50
+ opencos/tests/helpers.py,sha256=0KWHUQNXeyQ40F2sdW_R2r0P8qZpV88ndTZmoix3NcU,12474
51
51
  opencos/tests/test_build.py,sha256=FQAxOpLVQShAHD_L5rqJctPeSAoqoOCNFI0RXflLuY0,387
52
52
  opencos/tests/test_deps_helpers.py,sha256=uQZxleh6aKO-mZQhagHh5xLIBbpQ8dav7-5D0eemq_g,8164
53
53
  opencos/tests/test_deps_schema.py,sha256=T3P9KjaMyKsk8b7snNVvNSsom2hIJcg6Z9apYiXoH9Y,941
@@ -74,11 +74,11 @@ opencos/tools/quartus.py,sha256=_TfmPSYpbhmDLw7Dur-rRP0iGwv9hhQ6E5G-XLiYPEM,3048
74
74
  opencos/tools/questa.py,sha256=nHImM0Wydcf4YHGibHmQAwmqKHmMxKZUqY-E-vz1o8M,9827
75
75
  opencos/tools/questa_fse.py,sha256=hytkeuGg4qImj7rStV1i2kxkz9B0KFheGtcadxmpYAo,2550
76
76
  opencos/tools/riviera.py,sha256=FAumXIt9u4JXwR5BHe-0APX3K0Lg3RT2lWQ-GNGL3vA,13016
77
- opencos/tools/slang.py,sha256=UpsFeExup2awARxxxADD9f923Hw6ubiSEq2tKtJbS1c,8305
77
+ opencos/tools/slang.py,sha256=S_vODMT5Zl5vi9FMGHfahp5B0oMNyDIRJXtRAldVCwY,8625
78
78
  opencos/tools/slang_yosys.py,sha256=MKh13eAmLJDkynZiezyT8E2gI4CKnXipzgFCZppaMXo,10230
79
79
  opencos/tools/surelog.py,sha256=S2RAZJyjdISm_tRvAhXbla7_z_tJfotZih5f9Y3m7DQ,5648
80
80
  opencos/tools/tabbycad_yosys.py,sha256=2LePPgYXBVdsy7YcffPIWN-I0B7queLQ_f_pme2SCGw,7803
81
- opencos/tools/verilator.py,sha256=nVYF9F-VAHmT0uqmHpYZIvvZ2GjFIVW5zKpYBAWW8rI,20810
81
+ opencos/tools/verilator.py,sha256=yh3DZXhGxt9RyJVtbn2RoqIiwxZW6_sTiXs8xGf3iNg,21065
82
82
  opencos/tools/vivado.py,sha256=GQdPd1mp02it_uyhMqpFfJgh0AKIMn-20BhHNEDp5HY,41398
83
83
  opencos/tools/yosys.py,sha256=t3Au8gdwTepIKCPCXHpRXEdtmORQK8xqNvF6baIa7DM,28260
84
84
  opencos/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -88,10 +88,10 @@ opencos/utils/str_helpers.py,sha256=726ScK5-v7QkBi-zqESKZLsOl2_ya4vVJ5ZhxJqmBFo,
88
88
  opencos/utils/subprocess_helpers.py,sha256=xemAGPey6M0sWY_FElvr-Z0phCfdjaC-znP8FKihPaE,3535
89
89
  opencos/utils/vscode_helper.py,sha256=9nHyMUIL-gzfW-qLH06sgaCnVK-YTOtu6pusitNNhL8,1363
90
90
  opencos/utils/vsim_helper.py,sha256=1johPOGbjbMgnCDSTpgsQcSuAquiqq1Y2MBxS6WY6b4,1552
91
- opencos_eda-0.3.2.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
92
- opencos_eda-0.3.2.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
93
- opencos_eda-0.3.2.dist-info/METADATA,sha256=0PgS7CqBIdwYkBXPQ_6PaCFCNFKEsRz5G_owk48zkJI,666
94
- opencos_eda-0.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
95
- opencos_eda-0.3.2.dist-info/entry_points.txt,sha256=6n1T5NwVYDhN5l1h5zmyT197G4pE0SySDreB0QJzJR0,218
96
- opencos_eda-0.3.2.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
97
- opencos_eda-0.3.2.dist-info/RECORD,,
91
+ opencos_eda-0.3.3.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
92
+ opencos_eda-0.3.3.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
93
+ opencos_eda-0.3.3.dist-info/METADATA,sha256=MGcmalurglc-9-KPz1YHp-KOVgLwqOZRRu3cOz6asI0,703
94
+ opencos_eda-0.3.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
95
+ opencos_eda-0.3.3.dist-info/entry_points.txt,sha256=6n1T5NwVYDhN5l1h5zmyT197G4pE0SySDreB0QJzJR0,218
96
+ opencos_eda-0.3.3.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
97
+ opencos_eda-0.3.3.dist-info/RECORD,,