siliconcompiler 0.26.5__py3-none-any.whl → 0.27.1__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 (41) hide show
  1. siliconcompiler/_metadata.py +1 -1
  2. siliconcompiler/apps/sc.py +7 -5
  3. siliconcompiler/apps/sc_issue.py +2 -16
  4. siliconcompiler/checklists/oh_tapeout.py +2 -2
  5. siliconcompiler/core.py +104 -56
  6. siliconcompiler/flows/_common.py +2 -2
  7. siliconcompiler/flows/asicflow.py +4 -5
  8. siliconcompiler/flows/asictopflow.py +3 -3
  9. siliconcompiler/flows/dvflow.py +3 -4
  10. siliconcompiler/flows/fpgaflow.py +4 -8
  11. siliconcompiler/flows/generate_openroad_rcx.py +3 -3
  12. siliconcompiler/flows/lintflow.py +3 -3
  13. siliconcompiler/flows/screenshotflow.py +3 -3
  14. siliconcompiler/flows/showflow.py +11 -6
  15. siliconcompiler/flows/signoffflow.py +3 -3
  16. siliconcompiler/flows/synflow.py +4 -5
  17. siliconcompiler/fpgas/lattice_ice40.py +3 -4
  18. siliconcompiler/fpgas/vpr_example.py +3 -4
  19. siliconcompiler/scheduler/send_messages.py +2 -1
  20. siliconcompiler/schema/schema_cfg.py +1 -14
  21. siliconcompiler/schema/schema_obj.py +35 -24
  22. siliconcompiler/sphinx_ext/dynamicgen.py +4 -4
  23. siliconcompiler/targets/asic_demo.py +1 -1
  24. siliconcompiler/targets/fpgaflow_demo.py +1 -1
  25. siliconcompiler/tools/klayout/klayout.py +2 -1
  26. siliconcompiler/tools/magic/magic.py +2 -1
  27. siliconcompiler/tools/openroad/openroad.py +2 -1
  28. siliconcompiler/tools/opensta/__init__.py +2 -1
  29. siliconcompiler/tools/verilator/verilator.py +2 -1
  30. siliconcompiler/tools/vivado/vivado.py +2 -1
  31. siliconcompiler/tools/vpr/vpr.py +2 -1
  32. siliconcompiler/tools/yosys/syn_asic.py +2 -1
  33. siliconcompiler/tools/yosys/syn_fpga.py +2 -1
  34. siliconcompiler/tools/yosys/yosys.py +2 -1
  35. siliconcompiler/use.py +20 -20
  36. {siliconcompiler-0.26.5.dist-info → siliconcompiler-0.27.1.dist-info}/METADATA +10 -8
  37. {siliconcompiler-0.26.5.dist-info → siliconcompiler-0.27.1.dist-info}/RECORD +41 -41
  38. {siliconcompiler-0.26.5.dist-info → siliconcompiler-0.27.1.dist-info}/WHEEL +1 -1
  39. {siliconcompiler-0.26.5.dist-info → siliconcompiler-0.27.1.dist-info}/LICENSE +0 -0
  40. {siliconcompiler-0.26.5.dist-info → siliconcompiler-0.27.1.dist-info}/entry_points.txt +0 -0
  41. {siliconcompiler-0.26.5.dist-info → siliconcompiler-0.27.1.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,5 @@
1
1
  # Version number following semver standard.
2
- version = '0.26.5'
2
+ version = '0.27.1'
3
3
 
4
4
  # Default server address for remote runs, if unspecified.
5
5
  default_server = 'https://server.siliconcompiler.com'
@@ -39,9 +39,11 @@ def main():
39
39
 
40
40
  # Read command-line inputs and generate Chip objects to run the flow on.
41
41
  try:
42
- chip.create_cmdline(progname,
43
- description=description,
44
- input_map=get_default_iomap())
42
+ args = chip.create_cmdline(progname,
43
+ description=description,
44
+ input_map=get_default_iomap())
45
+ except SiliconCompilerError:
46
+ return 1
45
47
  except Exception as e:
46
48
  chip.logger.error(e)
47
49
  return 1
@@ -69,8 +71,8 @@ def main():
69
71
  chip.set('design', topmodule)
70
72
 
71
73
  # Set demo target if none specified
72
- if not chip.get('option', 'target'):
73
- chip.load_target(skywater130_demo)
74
+ if 'target' not in args or not args['target']:
75
+ chip.use(skywater130_demo)
74
76
 
75
77
  try:
76
78
  # Run flow
@@ -4,7 +4,6 @@ import os
4
4
  import siliconcompiler
5
5
  import tarfile
6
6
  import json
7
- import importlib
8
7
  from siliconcompiler.scheduler import _runtask, _executenode
9
8
  from siliconcompiler.issue import generate_testcase
10
9
  from siliconcompiler.tools._common import get_tool_task
@@ -18,7 +17,8 @@ def main():
18
17
  '-arg_index',
19
18
  '-tool_task_var',
20
19
  '-tool_task_option',
21
- '-loglevel']
20
+ '-loglevel',
21
+ '-use']
22
22
  description = """
23
23
  -----------------------------------------------------------
24
24
  Restricted SC app that generates a sharable testcase from a
@@ -54,11 +54,6 @@ To run a testcase, use:
54
54
  'help': 'run a provided testcase',
55
55
  'sc_print': False},
56
56
 
57
- '-use': {'action': 'append',
58
- 'help': 'modules to load into test run',
59
- 'metavar': '<module>',
60
- 'sc_print': False},
61
-
62
57
  '-add_library': {'action': 'append',
63
58
  'help': 'library to include in the testcase, if not provided all '
64
59
  'libraries will be added according to the -exclude_libraries flag',
@@ -155,15 +150,6 @@ To run a testcase, use:
155
150
  chip.logger.info(f"Changing {builddir_key} to '{new_builddir}'")
156
151
  chip.set(*builddir_key, new_builddir)
157
152
 
158
- if switches['use']:
159
- for use in switches['use']:
160
- try:
161
- module = importlib.import_module(use)
162
- chip.logger.info(f"Loading '{use}' module")
163
- chip.use(module)
164
- except ModuleNotFoundError:
165
- chip.logger.error(f"Unable to use '{use}' module")
166
-
167
153
  # Run task
168
154
  # Rerun setup task, assumed to be running in its own thread so
169
155
  # multiprocess is not needed
@@ -1,14 +1,14 @@
1
1
  import siliconcompiler
2
2
 
3
3
 
4
- def setup(chip):
4
+ def setup():
5
5
  '''Subset of OH! library tapeout checklist.
6
6
 
7
7
  https://github.com/aolofsson/oh/blob/master/docs/tapeout_checklist.md
8
8
  '''
9
9
  standard = 'oh_tapeout'
10
10
 
11
- checklist = siliconcompiler.Checklist(chip, standard)
11
+ checklist = siliconcompiler.Checklist(standard)
12
12
 
13
13
  # Automated
14
14
  checklist.set('checklist', standard, 'drc_clean', 'description',
siliconcompiler/core.py CHANGED
@@ -16,6 +16,7 @@ import textwrap
16
16
  import graphviz
17
17
  import codecs
18
18
  import copy
19
+ from inspect import getfullargspec
19
20
  from siliconcompiler.remote import client
20
21
  from siliconcompiler.schema import Schema, SCHEMA_VERSION
21
22
  from siliconcompiler.schema import utils as schema_utils
@@ -34,6 +35,7 @@ from siliconcompiler.flowgraph import _get_flowgraph_nodes, nodes_to_execute, \
34
35
  _get_flowgraph_execution_order, _check_flowgraph_io, \
35
36
  _get_flowgraph_information
36
37
  from siliconcompiler.tools._common import get_tool_task
38
+ from types import FunctionType, ModuleType
37
39
 
38
40
 
39
41
  class Chip:
@@ -226,6 +228,7 @@ class Chip:
226
228
  log_format.append('%(lineno)-4s')
227
229
 
228
230
  if in_run:
231
+ max_column_width = 20
229
232
  # Figure out how wide to make step and index fields
230
233
  max_step_len = 1
231
234
  max_index_len = 1
@@ -235,7 +238,8 @@ class Chip:
235
238
  for future_step, future_index in nodes_to_run:
236
239
  max_step_len = max(len(future_step), max_step_len)
237
240
  max_index_len = max(len(future_index), max_index_len)
238
- max_step_len = min(max_step_len, 20)
241
+ max_step_len = min(max_step_len, max_column_width)
242
+ max_index_len = min(max_index_len, max_column_width)
239
243
 
240
244
  jobname = self.get('option', 'jobname')
241
245
 
@@ -244,9 +248,9 @@ class Chip:
244
248
  if index is None:
245
249
  index = '-' * max(max_index_len // 4, 1)
246
250
 
247
- log_format.append(jobname)
251
+ log_format.append(utils.truncate_text(jobname, max_column_width))
248
252
  log_format.append(f'{utils.truncate_text(step, max_step_len): <{max_step_len}}')
249
- log_format.append(f'{index: >{max_index_len}}')
253
+ log_format.append(f'{utils.truncate_text(index, max_step_len): >{max_index_len}}')
250
254
 
251
255
  log_format.append('%(message)s')
252
256
  logformat = '| ' + ' | '.join(log_format)
@@ -298,7 +302,7 @@ class Chip:
298
302
  2. read_manifest([cfg])
299
303
  3. read compiler inputs
300
304
  4. all other switches
301
- 5. load_target('target')
305
+ 5. use(target)
302
306
 
303
307
  The cmdline interface is implemented using the Python argparse package
304
308
  and the following use restrictions apply.
@@ -360,9 +364,12 @@ class Chip:
360
364
  return 'O' + item
361
365
  return item
362
366
 
363
- def post_process(cmdargs):
367
+ def post_process(cmdargs, extra_params):
364
368
  # Ensure files and dir packages are set
365
369
  for key in self.allkeys():
370
+ if 'default' in key:
371
+ continue
372
+
366
373
  paramtype = self.get(*key, field='type')
367
374
  if 'file' not in paramtype and 'dir' not in paramtype:
368
375
  continue
@@ -370,6 +377,8 @@ class Chip:
370
377
  is_list = '[' in paramtype
371
378
 
372
379
  for vals, step, index in self.schema._getvals(*key):
380
+ if not vals:
381
+ continue
373
382
  if self.get(*key, field='pernode') != 'never':
374
383
  if step is None:
375
384
  step = Schema.GLOBAL_KEY
@@ -387,13 +396,58 @@ class Chip:
387
396
  self.set(*key, packages, field='package', step=step, index=index)
388
397
 
389
398
  # Read in target if set
390
- if 'option_target' in cmdargs:
391
- # running target command
392
- self.load_target(cmdargs['option_target'])
399
+ if "target" in extra_params:
400
+ if extra_params["target"]:
401
+ # running target command
402
+ # Search order "{name}", and "siliconcompiler.targets.{name}"
403
+ modules = []
404
+ module = extra_params["target"]
405
+ for mod_name in [module, f'siliconcompiler.targets.{module}']:
406
+ mod = self._load_module(mod_name)
407
+ if mod:
408
+ modules.append(mod)
409
+
410
+ if len(modules) == 0:
411
+ raise SiliconCompilerError(f'Could not find target {module}', chip=self)
412
+
413
+ self.use(modules[0])
414
+ extra_params["target"] = modules[0].__name__
415
+
416
+ if "use" in extra_params:
417
+ if extra_params["use"]:
418
+ for use in extra_params["use"]:
419
+ mod = self._load_module(use)
420
+ if mod is not None:
421
+ self.use(mod)
422
+ else:
423
+ raise ValueError(f'{use} is not a valid module.')
424
+ del extra_params["use"]
425
+
426
+ return extra_params
393
427
 
394
428
  if not progname:
395
429
  progname = self.design
396
430
 
431
+ if not additional_args:
432
+ additional_args = {}
433
+
434
+ if "-target" in additional_args:
435
+ raise ValueError('-target cannot be used as an additional argument')
436
+
437
+ additional_args["-target"] = {
438
+ "help": "target to load",
439
+ "metavar": "<target>"
440
+ }
441
+
442
+ if "-use" in additional_args:
443
+ raise ValueError('-use cannot be used as an additional argument')
444
+
445
+ additional_args["-use"] = {
446
+ "action": "append",
447
+ "help": "modules to load",
448
+ "metavar": "<module>"
449
+ }
450
+
397
451
  try:
398
452
  return self.schema.create_cmdline(
399
453
  progname=progname,
@@ -464,53 +518,18 @@ class Chip:
464
518
  """
465
519
  Loads a target module and runs the setup() function.
466
520
 
467
- The function searches the installed Python packages for <name> and
468
- siliconcompiler.targets.<name> and runs the setup function in that module
469
- if found.
470
-
471
521
  Args:
472
- module (str or module): Module name
522
+ module (module): Module name
473
523
  **kwargs (str): Options to pass along to the target
474
524
 
475
525
  Examples:
476
- >>> chip.load_target('freepdk45_demo', syn_np=5)
526
+ >>> chip.use(freepdk45_demo, syn_np=5)
477
527
  Loads the 'freepdk45_demo' target with 5 parallel synthesis tasks
478
528
  """
479
529
 
480
- if not inspect.ismodule(module):
481
- # Search order "{name}", and "siliconcompiler.targets.{name}"
482
- modules = []
483
- for mod_name in [module, f'siliconcompiler.targets.{module}']:
484
- mod = self._load_module(mod_name)
485
- if mod:
486
- modules.append(mod)
487
-
488
- if len(modules) == 0:
489
- raise SiliconCompilerError(f'Could not find target {module}', chip=self)
490
- else:
491
- modules = [module]
492
-
493
- # Check for setup in modules
494
- load_function = None
495
- for mod in modules:
496
- load_function = getattr(mod, 'setup', None)
497
- if load_function:
498
- module_name = mod.__name__
499
- break
500
-
501
- if not load_function:
502
- raise SiliconCompilerError(
503
- f'Could not find setup function for {module} target',
504
- chip=self)
505
-
506
- try:
507
- load_function(self, **kwargs)
508
- except Exception as e:
509
- self.logger.error(f'Failed to load target {module}')
510
- raise e
530
+ self.logger.warning(".load_target is deprecated, use .use() instead.")
511
531
 
512
- # Record target
513
- self.set('option', 'target', module_name)
532
+ self.use(module, **kwargs)
514
533
 
515
534
  ##########################################################################
516
535
  def use(self, module, **kwargs):
@@ -526,6 +545,8 @@ class Chip:
526
545
  - Action
527
546
  * - Module with setup function
528
547
  - Call `setup()` and import returned objects
548
+ * - A setup function
549
+ - Call `function()` and import returned objects
529
550
  * - Chip
530
551
  - Import as a library
531
552
  * - Library
@@ -547,18 +568,45 @@ class Chip:
547
568
  from siliconcompiler import Library
548
569
  from siliconcompiler import Checklist
549
570
 
550
- setup_func = getattr(module, 'setup', None)
551
- if (setup_func):
552
- # Call the module setup function.
553
- try:
554
- use_modules = setup_func(self, **kwargs)
555
- except Exception as e:
556
- self.logger.error(f'Unable to run setup() for {module.__name__}')
557
- raise e
571
+ func = None
572
+
573
+ if module is None:
574
+ raise ValueError('module parameter cannot be None')
575
+
576
+ if isinstance(module, ModuleType):
577
+ func = getattr(module, 'setup', None)
578
+ if func is None:
579
+ raise NotImplementedError(f'{module} does not have a setup()')
580
+ elif isinstance(module, FunctionType):
581
+ func = module
558
582
  else:
559
583
  # Import directly
560
584
  use_modules = module
561
585
 
586
+ if func:
587
+ # Call the setup function.
588
+ try:
589
+ func_spec = getfullargspec(func)
590
+
591
+ args_len = len(func_spec.args or []) - len(func_spec.defaults or [])
592
+
593
+ args = []
594
+ if args_len == 1:
595
+ args.append(self)
596
+ elif args_len > 1:
597
+ raise RuntimeError('function signature cannot have more than 1 argument')
598
+ use_modules = func(*args, **kwargs)
599
+
600
+ if args_len == 1 and use_modules:
601
+ self.logger.warning('Target returned items, which it should not have')
602
+ except Exception as e:
603
+ self.logger.error(f'Unable to run {func.__name__}() for {module.__name__}')
604
+ raise e
605
+
606
+ if use_modules is None:
607
+ # loaded a target so done
608
+ return
609
+
562
610
  # Make it a list for consistency
563
611
  if not isinstance(use_modules, list):
564
612
  use_modules = [use_modules]
@@ -3040,7 +3088,7 @@ class Chip:
3040
3088
 
3041
3089
  try:
3042
3090
  from siliconcompiler.flows import showflow
3043
- self.use(showflow, filetype=filetype, screenshot=screenshot)
3091
+ self.use(showflow, filetype=filetype, screenshot=screenshot, showtools=self._showtools)
3044
3092
  except Exception as e:
3045
3093
  self.logger.error(f"Flow setup failed: {e}")
3046
3094
  # restore environment
@@ -17,7 +17,7 @@ def _make_docs(chip):
17
17
  chip.set('input', 'hll', 'bsv', 'test')
18
18
  chip.set('input', 'hll', 'scala', 'test')
19
19
 
20
- chip.load_target(freepdk45_demo)
20
+ chip.use(freepdk45_demo)
21
21
 
22
22
 
23
23
  def __get_frontends(allow_system_verilog):
@@ -36,7 +36,7 @@ def __get_frontends(allow_system_verilog):
36
36
  }
37
37
 
38
38
 
39
- def setup_multiple_frontends(chip, flow, allow_system_verilog=False):
39
+ def setup_multiple_frontends(flow, allow_system_verilog=False):
40
40
  '''
41
41
  Sets of multiple frontends if different frontends are required.
42
42
 
@@ -22,14 +22,13 @@ from siliconcompiler.tools.builtin import minimum
22
22
  def make_docs(chip):
23
23
  n = 3
24
24
  _make_docs(chip)
25
- return setup(chip, syn_np=n, floorplan_np=n, physyn_np=n, place_np=n, cts_np=n, route_np=n)
25
+ return setup(syn_np=n, floorplan_np=n, physyn_np=n, place_np=n, cts_np=n, route_np=n)
26
26
 
27
27
 
28
28
  ###########################################################################
29
29
  # Flowgraph Setup
30
30
  ############################################################################
31
- def setup(chip,
32
- flowname='asicflow',
31
+ def setup(flowname='asicflow',
33
32
  syn_np=1,
34
33
  floorplan_np=1,
35
34
  physyn_np=1,
@@ -68,7 +67,7 @@ def setup(chip,
68
67
  * route_np : Number of parallel routing jobs to launch
69
68
  '''
70
69
 
71
- flow = siliconcompiler.Flow(chip, flowname)
70
+ flow = siliconcompiler.Flow(flowname)
72
71
 
73
72
  # Linear flow, up until branch to run parallel verification steps.
74
73
  longpipe = ['syn',
@@ -126,7 +125,7 @@ def setup(chip,
126
125
  flowtasks.append((step, tasks[step]))
127
126
 
128
127
  # Programmatically build linear portion of flowgraph and fanin/fanout args
129
- prevstep = setup_multiple_frontends(chip, flow)
128
+ prevstep = setup_multiple_frontends(flow)
130
129
  for step, task in flowtasks:
131
130
  fanout = 1
132
131
  if step in np:
@@ -6,14 +6,14 @@ from siliconcompiler.tools.klayout import export
6
6
  from siliconcompiler.flows._common import _make_docs
7
7
 
8
8
 
9
- def setup(chip):
9
+ def setup():
10
10
  '''A flow for stitching together hardened blocks without doing any automated
11
11
  place-and-route.
12
12
 
13
13
  This flow generates a GDS and a netlist for passing to a
14
14
  verification/signoff flow.
15
15
  '''
16
- flow = siliconcompiler.Flow(chip, 'asictopflow')
16
+ flow = siliconcompiler.Flow('asictopflow')
17
17
 
18
18
  flow.node(flow.design, 'import', surelog_parse)
19
19
  flow.node(flow.design, 'syn', syn_asic)
@@ -33,6 +33,6 @@ def setup(chip):
33
33
  if __name__ == "__main__":
34
34
  chip = siliconcompiler.Chip('design')
35
35
  _make_docs(chip)
36
- flow = setup(chip)
36
+ flow = setup()
37
37
  chip.use(flow)
38
38
  chip.write_flowgraph(f"{flow.top()}.png", flow=flow.top())
@@ -10,14 +10,13 @@ from siliconcompiler.tools.execute import exec_input
10
10
  ############################################################################
11
11
  def make_docs(chip):
12
12
  chip.set('input', 'rtl', 'netlist', 'test')
13
- return setup(chip, np=5)
13
+ return setup(np=5)
14
14
 
15
15
 
16
16
  #############################################################################
17
17
  # Flowgraph Setup
18
18
  #############################################################################
19
- def setup(chip,
20
- flowname='dvflow',
19
+ def setup(flowname='dvflow',
21
20
  tool='icarus',
22
21
  np=1):
23
22
  '''
@@ -35,7 +34,7 @@ def setup(chip,
35
34
  This flow is a WIP
36
35
  '''
37
36
 
38
- flow = siliconcompiler.Flow(chip, flowname)
37
+ flow = siliconcompiler.Flow(flowname)
39
38
 
40
39
  tasks = {
41
40
  'compile': None,
@@ -23,14 +23,13 @@ from siliconcompiler.tools.nextpnr import apr as nextpnr_apr
23
23
  ############################################################################
24
24
  def make_docs(chip):
25
25
  _make_docs(chip)
26
- chip.set('fpga', 'partname', 'example_arch')
27
- return setup(chip)
26
+ return setup(partname='example_arch')
28
27
 
29
28
 
30
29
  ############################################################################
31
30
  # Flowgraph Setup
32
31
  ############################################################################
33
- def setup(chip, flowname='fpgaflow', fpgaflow_type=None, partname=None):
32
+ def setup(flowname='fpgaflow', fpgaflow_type=None, partname=None):
34
33
  '''
35
34
  A configurable FPGA compilation flow.
36
35
 
@@ -60,10 +59,7 @@ def setup(chip, flowname='fpgaflow', fpgaflow_type=None, partname=None):
60
59
  flow instead of one selected from the partname set in the schema.
61
60
  '''
62
61
 
63
- flow = siliconcompiler.Flow(chip, flowname)
64
-
65
- if not partname:
66
- partname = chip.get('fpga', 'partname')
62
+ flow = siliconcompiler.Flow(flowname)
67
63
 
68
64
  if fpgaflow_type:
69
65
  flow_pipe = flow_lookup_by_type(fpgaflow_type)
@@ -71,7 +67,7 @@ def setup(chip, flowname='fpgaflow', fpgaflow_type=None, partname=None):
71
67
  flow_pipe = flow_lookup(partname)
72
68
 
73
69
  # Minimal setup
74
- prevstep = setup_multiple_frontends(chip, flow)
70
+ prevstep = setup_multiple_frontends(flow)
75
71
  for step, tool_module in flow_pipe:
76
72
  # Flow
77
73
  flow.node(flowname, step, tool_module)
@@ -11,20 +11,20 @@ from siliconcompiler.flows._common import _make_docs
11
11
  ############################################################################
12
12
  def make_docs(chip):
13
13
  _make_docs(chip)
14
- return setup(chip, corners=5)
14
+ return setup(corners=5)
15
15
 
16
16
 
17
17
  ###########################################################################
18
18
  # Flowgraph Setup
19
19
  ############################################################################
20
- def setup(chip, extraction_task=None, corners=1, serial_extraction=False):
20
+ def setup(extraction_task=None, corners=1, serial_extraction=False):
21
21
  '''
22
22
  Flow to generate the OpenRCX decks needed by OpenROAD to do parasitic
23
23
  extraction.
24
24
  '''
25
25
 
26
26
  flowname = 'generate_rcx'
27
- flow = siliconcompiler.Flow(chip, flowname)
27
+ flow = siliconcompiler.Flow(flowname)
28
28
 
29
29
  if not extraction_task:
30
30
  chip.logger.warning('Valid extraction not specified, defaulting to builtin/nop')
@@ -8,13 +8,13 @@ from siliconcompiler.tools.slang import lint as slang_lint
8
8
  ###########################################################################
9
9
  # Flowgraph Setup
10
10
  ############################################################################
11
- def setup(chip, tool='verilator'):
11
+ def setup(tool='verilator'):
12
12
  '''
13
13
  An RTL linting flow.
14
14
  '''
15
15
 
16
16
  flowname = 'lintflow'
17
- flow = siliconcompiler.Flow(chip, flowname)
17
+ flow = siliconcompiler.Flow(flowname)
18
18
 
19
19
  if tool == 'verilator':
20
20
  flow.node(flowname, 'lint', verilator_lint)
@@ -30,6 +30,6 @@ def setup(chip, tool='verilator'):
30
30
  if __name__ == "__main__":
31
31
  chip = siliconcompiler.Chip('design')
32
32
  _make_docs(chip)
33
- flow = setup(chip)
33
+ flow = setup()
34
34
  chip.use(flow)
35
35
  chip.write_flowgraph(f"{flow.top()}.png", flow=flow.top())
@@ -11,10 +11,10 @@ def make_docs(chip):
11
11
  chip.set('tool', 'klayout', 'task', 'screenshot', 'var', 'ybins', 2)
12
12
  chip.set('tool', 'montage', 'task', 'tile', 'var', 'xbins', 2)
13
13
  chip.set('tool', 'montage', 'task', 'tile', 'var', 'ybins', 2)
14
- return setup(chip)
14
+ return setup()
15
15
 
16
16
 
17
- def setup(chip, flowname='screenshotflow'):
17
+ def setup(flowname='screenshotflow'):
18
18
  '''
19
19
  Flow to generate a high resolution design image from a GDS or OAS file.
20
20
 
@@ -31,7 +31,7 @@ def setup(chip, flowname='screenshotflow'):
31
31
  ('merge', tile)
32
32
  ]
33
33
 
34
- flow = Flow(chip, flowname)
34
+ flow = Flow(flowname)
35
35
 
36
36
  prevstep = None
37
37
  for step, task in pipe:
@@ -1,19 +1,20 @@
1
1
  import siliconcompiler
2
2
  from siliconcompiler import SiliconCompilerError
3
+ from siliconcompiler.targets import freepdk45_demo
3
4
 
4
5
 
5
6
  ############################################################################
6
7
  # DOCS
7
8
  ############################################################################
8
9
  def make_docs(chip):
9
- chip.load_target('freepdk45_demo')
10
- return setup(chip, filetype='gds', np=3)
10
+ chip.use(freepdk45_demo)
11
+ return setup(filetype='gds', showtools=chip._showtools, np=3)
11
12
 
12
13
 
13
14
  ###########################################################################
14
15
  # Flowgraph Setup
15
16
  ############################################################################
16
- def setup(chip, flowname='showflow', filetype=None, screenshot=False, np=1):
17
+ def setup(flowname='showflow', filetype=None, screenshot=False, showtools=None, np=1):
17
18
  '''
18
19
  A flow to show the output files generated from other flows.
19
20
 
@@ -25,18 +26,22 @@ def setup(chip, flowname='showflow', filetype=None, screenshot=False, np=1):
25
26
 
26
27
  * np : Number of parallel show jobs to launch
27
28
  * screenshot : true/false, indicate if this should be configured as a screenshot
29
+ * showtools: dictionary of file extensions with the associated show and screenshot tasks
28
30
  '''
29
31
 
30
- flow = siliconcompiler.Flow(chip, flowname)
32
+ flow = siliconcompiler.Flow(flowname)
31
33
 
32
34
  # Get required parameters first
33
35
  if not filetype:
34
36
  raise ValueError('filetype is a required argument')
35
37
 
36
- if filetype not in chip._showtools:
38
+ if not showtools:
39
+ raise ValueError('showtools is a required argument')
40
+
41
+ if filetype not in showtools:
37
42
  raise SiliconCompilerError(f'Show tool for {filetype} is not defined.')
38
43
 
39
- show_tool = chip._showtools[filetype]
44
+ show_tool = showtools[filetype]
40
45
 
41
46
  stepname = 'show'
42
47
  if screenshot:
@@ -9,10 +9,10 @@ from siliconcompiler.tools.builtin import join
9
9
 
10
10
  def make_docs(chip):
11
11
  chip.set('input', 'netlist', 'verilog', 'test')
12
- return setup(chip)
12
+ return setup()
13
13
 
14
14
 
15
- def setup(chip):
15
+ def setup():
16
16
  '''A flow for running LVS/DRC signoff on a GDS layout.
17
17
 
18
18
  Inputs must be passed to this flow as follows::
@@ -22,7 +22,7 @@ def setup(chip):
22
22
  '''
23
23
  flowname = 'signoffflow'
24
24
 
25
- flow = siliconcompiler.Flow(chip, flowname)
25
+ flow = siliconcompiler.Flow(flowname)
26
26
 
27
27
  # nop import since we don't need to pull in any sources
28
28
  flow.node(flowname, 'import', nop)