siliconcompiler 0.29.1__py3-none-any.whl → 0.29.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.
Files changed (81) hide show
  1. siliconcompiler/_metadata.py +1 -1
  2. siliconcompiler/apps/sc_install.py +2 -2
  3. siliconcompiler/core.py +18 -8
  4. siliconcompiler/flowgraph.py +23 -5
  5. siliconcompiler/scheduler/__init__.py +21 -9
  6. siliconcompiler/tools/__init__.py +2 -0
  7. siliconcompiler/tools/_common/asic.py +70 -0
  8. siliconcompiler/tools/_common/tcl/sc_pin_constraints.tcl +2 -2
  9. siliconcompiler/tools/bambu/convert.py +2 -1
  10. siliconcompiler/tools/bluespec/convert.py +2 -1
  11. siliconcompiler/tools/chisel/convert.py +2 -1
  12. siliconcompiler/tools/genfasm/bitstream.py +2 -2
  13. siliconcompiler/tools/ghdl/convert.py +2 -2
  14. siliconcompiler/tools/gtkwave/__init__.py +39 -0
  15. siliconcompiler/tools/gtkwave/scripts/sc_show.tcl +34 -0
  16. siliconcompiler/tools/gtkwave/show.py +71 -0
  17. siliconcompiler/tools/icarus/compile.py +6 -2
  18. siliconcompiler/tools/klayout/drc.py +2 -1
  19. siliconcompiler/tools/magic/magic.py +1 -1
  20. siliconcompiler/tools/netgen/lvs.py +2 -1
  21. siliconcompiler/tools/openroad/_apr.py +14 -5
  22. siliconcompiler/tools/openroad/global_placement.py +23 -2
  23. siliconcompiler/tools/openroad/rdlroute.py +2 -2
  24. siliconcompiler/tools/openroad/scripts/apr/sc_clock_tree_synthesis.tcl +1 -1
  25. siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl +64 -1
  26. siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl +78 -94
  27. siliconcompiler/tools/openroad/scripts/apr/sc_power_grid.tcl +11 -1
  28. siliconcompiler/tools/openroad/scripts/apr/sc_repair_design.tcl +4 -0
  29. siliconcompiler/tools/openroad/scripts/apr/sc_repair_timing.tcl +7 -1
  30. siliconcompiler/tools/openroad/scripts/common/procs.tcl +39 -3
  31. siliconcompiler/tools/openroad/scripts/common/reports.tcl +4 -0
  32. siliconcompiler/tools/openroad/scripts/common/write_data.tcl +2 -5
  33. siliconcompiler/tools/openroad/scripts/common/write_data_physical.tcl +3 -0
  34. siliconcompiler/tools/openroad/scripts/common/write_data_timing.tcl +1 -0
  35. siliconcompiler/tools/openroad/scripts/common/write_images.tcl +10 -1
  36. siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +1 -1
  37. siliconcompiler/tools/opensta/__init__.py +2 -2
  38. siliconcompiler/tools/opensta/report_libraries.py +2 -2
  39. siliconcompiler/tools/opensta/timing.py +2 -1
  40. siliconcompiler/tools/slang/__init__.py +78 -2
  41. siliconcompiler/tools/slang/elaborate.py +46 -0
  42. siliconcompiler/tools/slang/lint.py +10 -76
  43. siliconcompiler/tools/surelog/parse.py +1 -1
  44. siliconcompiler/tools/sv2v/convert.py +2 -2
  45. siliconcompiler/tools/template/template.py +2 -2
  46. siliconcompiler/tools/verilator/compile.py +11 -0
  47. siliconcompiler/tools/verilator/verilator.py +3 -2
  48. siliconcompiler/tools/vivado/vivado.py +2 -1
  49. siliconcompiler/tools/vpr/place.py +2 -2
  50. siliconcompiler/tools/vpr/route.py +2 -2
  51. siliconcompiler/tools/vpr/show.py +2 -1
  52. siliconcompiler/tools/yosys/syn_asic.py +8 -0
  53. siliconcompiler/tools/yosys/syn_asic.tcl +4 -0
  54. siliconcompiler/toolscripts/_tools.json +8 -3
  55. siliconcompiler/toolscripts/rhel8/install-slang.sh +0 -0
  56. siliconcompiler/toolscripts/rhel8/install-sv2v.sh +7 -1
  57. siliconcompiler/toolscripts/rhel9/install-gtkwave.sh +40 -0
  58. siliconcompiler/toolscripts/rhel9/install-slang.sh +0 -0
  59. siliconcompiler/toolscripts/rhel9/install-sv2v.sh +7 -1
  60. siliconcompiler/toolscripts/ubuntu20/install-gtkwave.sh +28 -0
  61. siliconcompiler/toolscripts/ubuntu20/install-slang.sh +0 -0
  62. siliconcompiler/toolscripts/ubuntu20/install-surelog.sh +1 -0
  63. siliconcompiler/toolscripts/ubuntu20/install-sv2v.sh +7 -1
  64. siliconcompiler/toolscripts/ubuntu22/install-gtkwave.sh +28 -0
  65. siliconcompiler/toolscripts/ubuntu22/install-slang.sh +0 -0
  66. siliconcompiler/toolscripts/ubuntu22/install-surelog.sh +7 -1
  67. siliconcompiler/toolscripts/ubuntu22/install-sv2v.sh +7 -1
  68. siliconcompiler/toolscripts/ubuntu24/install-bambu.sh +3 -4
  69. siliconcompiler/toolscripts/ubuntu24/install-gtkwave.sh +29 -0
  70. siliconcompiler/toolscripts/ubuntu24/install-slang.sh +0 -0
  71. siliconcompiler/toolscripts/ubuntu24/install-surelog.sh +7 -1
  72. siliconcompiler/toolscripts/ubuntu24/install-sv2v.sh +7 -1
  73. siliconcompiler/utils/__init__.py +22 -0
  74. siliconcompiler/utils/logging.py +67 -0
  75. siliconcompiler/utils/showtools.py +3 -0
  76. {siliconcompiler-0.29.1.dist-info → siliconcompiler-0.29.3.dist-info}/METADATA +8 -8
  77. {siliconcompiler-0.29.1.dist-info → siliconcompiler-0.29.3.dist-info}/RECORD +76 -65
  78. {siliconcompiler-0.29.1.dist-info → siliconcompiler-0.29.3.dist-info}/LICENSE +0 -0
  79. {siliconcompiler-0.29.1.dist-info → siliconcompiler-0.29.3.dist-info}/WHEEL +0 -0
  80. {siliconcompiler-0.29.1.dist-info → siliconcompiler-0.29.3.dist-info}/entry_points.txt +0 -0
  81. {siliconcompiler-0.29.1.dist-info → siliconcompiler-0.29.3.dist-info}/top_level.txt +0 -0
@@ -5,7 +5,7 @@ from siliconcompiler import utils
5
5
  from siliconcompiler.tools._common import input_provides, add_common_file, \
6
6
  get_tool_task, record_metric
7
7
  from siliconcompiler.tools._common.asic import get_mainlib, set_tool_task_var, get_libraries, \
8
- CellArea
8
+ CellArea, set_tool_task_lib_var
9
9
  from siliconcompiler.tools.openroad import setup as tool_setup
10
10
 
11
11
 
@@ -16,7 +16,7 @@ def setup(chip, exit=True):
16
16
  index = chip.get('arg', 'index')
17
17
  tool, task = get_tool_task(chip, step, index)
18
18
 
19
- chip.set('tool', tool, 'task', task, 'threads', os.cpu_count(),
19
+ chip.set('tool', tool, 'task', task, 'threads', utils.get_cores(chip),
20
20
  step=step, index=index)
21
21
 
22
22
  pdkname = chip.get('option', 'pdk')
@@ -792,6 +792,10 @@ def define_psm_params(chip):
792
792
  'list of nets to skip power grid analysis on',
793
793
  field='help')
794
794
 
795
+ chip.set('tool', tool, 'task', task, 'var', 'psm_allow_missing_terminal_nets',
796
+ 'list of nets where a missing terminal is acceptable',
797
+ field='help')
798
+
795
799
 
796
800
  def define_fin_params(chip):
797
801
  set_tool_task_var(chip, param_key='fin_add_fill',
@@ -810,9 +814,6 @@ def define_mpl_params(chip):
810
814
  schelp='macro channel to use when performing automated '
811
815
  'macro placement ([x, y] in microns)')
812
816
 
813
- set_tool_task_var(chip, param_key='rtlmp_enable',
814
- default_value=True,
815
- schelp='true/false, enables the RTLMP macro placement')
816
817
  set_tool_task_var(chip, param_key='rtlmp_min_instances',
817
818
  schelp='minimum number of instances to use while clustering for '
818
819
  'macro placement')
@@ -894,6 +895,14 @@ def define_ord_params(chip):
894
895
  require=['key'],
895
896
  schelp='number of Y bins to use for heatmap image generation')
896
897
 
898
+ set_tool_task_lib_var(chip, param_key='scan_chain_cells',
899
+ default_value=None,
900
+ schelp='cells to use for scan chain insertion')
901
+
902
+ set_tool_task_lib_var(chip, param_key='multibit_ff_cells',
903
+ default_value=None,
904
+ schelp='multibit flipflop cells')
905
+
897
906
 
898
907
  def define_ord_files(chip):
899
908
  step = chip.get('arg', 'step')
@@ -1,9 +1,11 @@
1
1
  from siliconcompiler.tools._common import get_tool_task
2
2
  from siliconcompiler.tools.openroad._apr import setup as apr_setup
3
- from siliconcompiler.tools.openroad._apr import set_reports, set_pnr_inputs, set_pnr_outputs
3
+ from siliconcompiler.tools.openroad._apr import set_reports, set_pnr_inputs, set_pnr_outputs, \
4
+ set_tool_task_var
4
5
  from siliconcompiler.tools.openroad._apr import \
5
6
  define_ord_params, define_sta_params, define_sdc_params, \
6
- define_gpl_params, define_grt_params, define_rsz_params
7
+ define_gpl_params, define_grt_params, define_rsz_params, \
8
+ define_ppl_params
7
9
  from siliconcompiler.tools.openroad._apr import build_pex_corners, define_ord_files
8
10
  from siliconcompiler.tools.openroad._apr import extract_metrics
9
11
 
@@ -35,6 +37,7 @@ def setup(chip):
35
37
  define_gpl_params(chip)
36
38
  define_grt_params(chip)
37
39
  define_rsz_params(chip)
40
+ define_ppl_params(chip)
38
41
 
39
42
  set_reports(chip, [
40
43
  'setup',
@@ -48,6 +51,24 @@ def setup(chip):
48
51
  'power_density'
49
52
  ])
50
53
 
54
+ set_tool_task_var(chip, param_key='enable_multibit_clustering',
55
+ default_value=False,
56
+ schelp='true/false, when true multibit clustering will be performed.')
57
+
58
+ set_tool_task_var(chip, param_key='enable_scan_chains',
59
+ default_value=False,
60
+ schelp='true/false, when true scan chains will be inserted.')
61
+
62
+ set_tool_task_var(chip, param_key='scan_enable_port_pattern',
63
+ schelp='pattern of the scan chain enable port.',
64
+ skip=['pdk', 'lib'])
65
+ set_tool_task_var(chip, param_key='scan_in_port_pattern',
66
+ schelp='pattern of the scan chain in port.',
67
+ skip=['pdk', 'lib'])
68
+ set_tool_task_var(chip, param_key='scan_out_port_pattern',
69
+ schelp='pattern of the scan chain out port.',
70
+ skip=['pdk', 'lib'])
71
+
51
72
 
52
73
  def pre_process(chip):
53
74
  define_ord_files(chip)
@@ -1,5 +1,6 @@
1
1
  import os
2
2
 
3
+ from siliconcompiler import utils
3
4
  from siliconcompiler.tools._common import input_provides, get_tool_task
4
5
  from siliconcompiler.tools._common.asic import set_tool_task_var
5
6
  from siliconcompiler.tools.openroad._apr import build_pex_corners
@@ -44,7 +45,7 @@ def setup(chip):
44
45
  package='siliconcompiler')
45
46
  chip.set('tool', tool, 'task', task, 'script', script,
46
47
  step=step, index=index)
47
- chip.set('tool', tool, 'task', task, 'threads', os.cpu_count(),
48
+ chip.set('tool', tool, 'task', task, 'threads', utils.get_cores(chip),
48
49
  step=step, index=index, clobber=False)
49
50
 
50
51
  if chip.get('option', 'nodisplay'):
@@ -83,7 +84,6 @@ def setup(chip):
83
84
  ','.join(['input', 'netlist', 'verilog']),
84
85
  step=step, index=index)
85
86
 
86
- chip.add('tool', tool, 'task', task, 'output', design + '.sdc', step=step, index=index)
87
87
  chip.add('tool', tool, 'task', task, 'output', design + '.vg', step=step, index=index)
88
88
  chip.add('tool', tool, 'task', task, 'output', design + '.def', step=step, index=index)
89
89
  chip.add('tool', tool, 'task', task, 'output', design + '.odb', step=step, index=index)
@@ -17,7 +17,7 @@ source -echo "$sc_refdir/apr/preamble.tcl"
17
17
  ###############################
18
18
 
19
19
  if { [llength [all_clocks]] > 0 } {
20
- sc_set_dont_use -clock
20
+ sc_set_dont_use -clock -report dont_use.clock_tree_synthesis
21
21
 
22
22
  # Clone clock tree inverters next to register loads
23
23
  # so cts does not try to buffer the inverted clocks.
@@ -11,16 +11,79 @@ source ./sc_manifest.tcl > /dev/null
11
11
  set sc_refdir [sc_cfg_tool_task_get refdir]
12
12
  source -echo "$sc_refdir/apr/preamble.tcl"
13
13
 
14
+ set dont_use_args []
15
+
16
+ if { [lindex [sc_cfg_tool_task_get var enable_scan_chains] 0] == "true" } {
17
+ lappend dont_use_args -scanchain
18
+ }
19
+ if { [lindex [sc_cfg_tool_task_get var enable_multibit_clustering] 0] == "true" } {
20
+ lappend dont_use_args -multibit
21
+ }
22
+
23
+ sc_set_dont_use {*}$dont_use_args -report dont_use.global_placement
24
+
25
+ ###############################
26
+ # Scan Chain Preparation
27
+ ###############################
28
+
29
+ if { [lindex [sc_cfg_tool_task_get var enable_scan_chains] 0] == "true" } {
30
+ set dft_args []
31
+ if { [sc_cfg_tool_task_get var scan_in_port_pattern] != [] } {
32
+ lappend dft_args -scan_in_name_pattern \
33
+ [lindex [sc_cfg_tool_task_get var scan_in_port_pattern] 0]
34
+ }
35
+ if { [sc_cfg_tool_task_get var scan_out_port_pattern] != [] } {
36
+ lappend dft_args -scan_out_name_pattern \
37
+ [lindex [sc_cfg_tool_task_get var scan_out_port_pattern] 0]
38
+ }
39
+ if { [sc_cfg_tool_task_get var scan_enable_port_pattern] != [] } {
40
+ lappend dft_args -scan_enable_name_pattern \
41
+ [lindex [sc_cfg_tool_task_get var scan_enable_port_pattern] 0]
42
+ }
43
+
44
+ set_dft_config -clock_mixing clock_mix {*}$dft_args
45
+ tee -file reports/scan_chain_config.rpt {report_dft_config}
46
+ scan_replace
47
+ }
48
+
49
+ ###############################
50
+ # Perform multi-bit clustering
51
+ ###############################
52
+
53
+ if { [lindex [sc_cfg_tool_task_get var enable_multibit_clustering] 0] == "true" } {
54
+ cluster_flops
55
+ }
56
+
14
57
  ###############################
15
58
  # Global Placement
16
59
  ###############################
17
60
 
18
61
  sc_global_placement
19
62
 
20
- estimate_parasitics -placement
63
+ ###############################
64
+ # Scan Chain Finalize
65
+ ###############################
66
+
67
+ if { [lindex [sc_cfg_tool_task_get var enable_scan_chains] 0] == "true" } {
68
+ tee -file reports/scan_chain.rpt {preview_dft -verbose}
69
+ insert_dft
70
+
71
+ set new_ios [sc_get_unplaced_io_nets]
72
+ if { [llength $new_ios] > 0 } {
73
+ foreach net $new_ios {
74
+ utl::report "New IO net [$net getName]"
75
+ }
76
+ utl::warn FLW 1 "Scan chain generated new ports, rerunning pin placement"
77
+ sc_pin_placement
78
+ }
79
+ }
21
80
 
22
81
  ###############################
23
82
  # Task Postamble
24
83
  ###############################
25
84
 
85
+ sc_set_dont_use
86
+
87
+ estimate_parasitics -placement
88
+
26
89
  source -echo "$sc_refdir/apr/postamble.tcl"
@@ -14,104 +14,88 @@ source -echo "$sc_refdir/apr/preamble.tcl"
14
14
  # Need to check if we have any macros before performing macro placement,
15
15
  # since we get an error otherwise.
16
16
  if { [sc_design_has_unplaced_macros] } {
17
- if { [lindex [sc_cfg_tool_task_get var rtlmp_enable] 0] == "true" } {
18
- ###############################
19
- # Macro placement
20
- ###############################
17
+ ###############################
18
+ # Macro placement
19
+ ###############################
21
20
 
22
- lassign [sc_cfg_tool_task_get var macro_place_halo] halo_x halo_y
21
+ lassign [sc_cfg_tool_task_get var macro_place_halo] halo_x halo_y
23
22
 
24
- set rtlmp_args []
25
- set rtlmp_max_levels [lindex [sc_cfg_tool_task_get var rtlmp_max_levels] 0]
26
- if { $rtlmp_max_levels != "" } {
27
- lappend rtlmp_args -max_num_level $rtlmp_max_levels
28
- }
29
- set rtlmp_min_instances [lindex [sc_cfg_tool_task_get var rtlmp_min_instances] 0]
30
- if { $rtlmp_min_instances != "" } {
31
- lappend rtlmp_args -min_num_inst $rtlmp_min_instances
32
- }
33
- set rtlmp_max_instances [lindex [sc_cfg_tool_task_get var rtlmp_max_instances] 0]
34
- if { $rtlmp_max_instances != "" } {
35
- lappend rtlmp_args -max_num_inst $rtlmp_max_instances
36
- }
37
- set rtlmp_min_macros [lindex [sc_cfg_tool_task_get var rtlmp_min_macros] 0]
38
- if { $rtlmp_min_macros != "" } {
39
- lappend rtlmp_args -min_num_macro $rtlmp_min_macros
40
- }
41
- set rtlmp_max_macros [lindex [sc_cfg_tool_task_get var rtlmp_max_macros] 0]
42
- if { $rtlmp_max_macros != "" } {
43
- lappend rtlmp_args -max_num_macro $rtlmp_max_macros
44
- }
45
- set rtlmp_min_aspect_ratio [lindex [sc_cfg_tool_task_get var rtlmp_min_aspect_ratio] 0]
46
- if { $rtlmp_min_aspect_ratio != "" } {
47
- lappend rtlmp_args -min_ar $rtlmp_min_aspect_ratio
48
- }
49
- set rtlmp_fence [sc_cfg_tool_task_get var rtlmp_fence]
50
- if { $rtlmp_fence != "" } {
51
- lappend rtlmp_args -fence_lx [lindex $rtlmp_fence 0]
52
- lappend rtlmp_args -fence_ly [lindex $rtlmp_fence 1]
53
- lappend rtlmp_args -fence_ux [lindex $rtlmp_fence 2]
54
- lappend rtlmp_args -fence_uy [lindex $rtlmp_fence 3]
55
- }
56
- set rtlmp_bus_planning [lindex [sc_cfg_tool_task_get var rtlmp_bus_planning] 0]
57
- if { $rtlmp_bus_planning == "true" } {
58
- lappend rtlmp_args -bus_planning
59
- }
60
- set rtlmp_target_dead_space [lindex [sc_cfg_tool_task_get var rtlmp_target_dead_space] 0]
61
- if { $rtlmp_target_dead_space != "" } {
62
- lappend rtlmp_args -target_dead_space $rtlmp_target_dead_space
63
- }
64
-
65
- set rtlmp_area_weight [lindex [sc_cfg_tool_task_get var rtlmp_area_weight] 0]
66
- if { $rtlmp_area_weight != "" } {
67
- lappend rtlmp_args -area_weight $rtlmp_area_weight
68
- }
69
- set rtlmp_outline_weight [lindex [sc_cfg_tool_task_get var rtlmp_outline_weight] 0]
70
- if { $rtlmp_outline_weight != "" } {
71
- lappend rtlmp_args -outline_weight $rtlmp_outline_weight
72
- }
73
- set rtlmp_wirelength_weight [lindex [sc_cfg_tool_task_get var rtlmp_wirelength_weight] 0]
74
- if { $rtlmp_wirelength_weight != "" } {
75
- lappend rtlmp_args -wirelength_weight $rtlmp_wirelength_weight
76
- }
77
- set rtlmp_guidance_weight [lindex [sc_cfg_tool_task_get var rtlmp_guidance_weight] 0]
78
- if { $rtlmp_guidance_weight != "" } {
79
- lappend rtlmp_args -guidance_weight $rtlmp_guidance_weight
80
- }
81
- set rtlmp_fence_weight [lindex [sc_cfg_tool_task_get var rtlmp_fence_weight] 0]
82
- if { $rtlmp_fence_weight != "" } {
83
- lappend rtlmp_args -fence_weight $rtlmp_fence_weight
84
- }
85
- set rtlmp_notch_weight [lindex [sc_cfg_tool_task_get var rtlmp_notch_weight] 0]
86
- if { $rtlmp_notch_weight != "" } {
87
- lappend rtlmp_args -notch_weight $rtlmp_notch_weight
88
- }
89
- set rtlmp_blockage_weight [lindex [sc_cfg_tool_task_get var rtlmp_blockage_weight] 0]
90
- if { $rtlmp_blockage_weight != "" } {
91
- lappend rtlmp_args -blockage_weight $rtlmp_blockage_weight
92
- }
93
-
94
- rtl_macro_placer \
95
- -report_directory reports/rtlmp \
96
- -halo_width $halo_x \
97
- -halo_height $halo_y \
98
- -target_util [sc_global_placement_density] \
99
- {*}$rtlmp_args
100
- } else {
101
- ###############################
102
- # TDMS Global Placement
103
- ###############################
104
-
105
- sc_global_placement -disable_routability_driven
106
-
107
- ###############################
108
- # Macro placement
109
- ###############################
23
+ set rtlmp_args []
24
+ set rtlmp_max_levels [lindex [sc_cfg_tool_task_get var rtlmp_max_levels] 0]
25
+ if { $rtlmp_max_levels != "" } {
26
+ lappend rtlmp_args -max_num_level $rtlmp_max_levels
27
+ }
28
+ set rtlmp_min_instances [lindex [sc_cfg_tool_task_get var rtlmp_min_instances] 0]
29
+ if { $rtlmp_min_instances != "" } {
30
+ lappend rtlmp_args -min_num_inst $rtlmp_min_instances
31
+ }
32
+ set rtlmp_max_instances [lindex [sc_cfg_tool_task_get var rtlmp_max_instances] 0]
33
+ if { $rtlmp_max_instances != "" } {
34
+ lappend rtlmp_args -max_num_inst $rtlmp_max_instances
35
+ }
36
+ set rtlmp_min_macros [lindex [sc_cfg_tool_task_get var rtlmp_min_macros] 0]
37
+ if { $rtlmp_min_macros != "" } {
38
+ lappend rtlmp_args -min_num_macro $rtlmp_min_macros
39
+ }
40
+ set rtlmp_max_macros [lindex [sc_cfg_tool_task_get var rtlmp_max_macros] 0]
41
+ if { $rtlmp_max_macros != "" } {
42
+ lappend rtlmp_args -max_num_macro $rtlmp_max_macros
43
+ }
44
+ set rtlmp_min_aspect_ratio [lindex [sc_cfg_tool_task_get var rtlmp_min_aspect_ratio] 0]
45
+ if { $rtlmp_min_aspect_ratio != "" } {
46
+ lappend rtlmp_args -min_ar $rtlmp_min_aspect_ratio
47
+ }
48
+ set rtlmp_fence [sc_cfg_tool_task_get var rtlmp_fence]
49
+ if { $rtlmp_fence != "" } {
50
+ lappend rtlmp_args -fence_lx [lindex $rtlmp_fence 0]
51
+ lappend rtlmp_args -fence_ly [lindex $rtlmp_fence 1]
52
+ lappend rtlmp_args -fence_ux [lindex $rtlmp_fence 2]
53
+ lappend rtlmp_args -fence_uy [lindex $rtlmp_fence 3]
54
+ }
55
+ set rtlmp_bus_planning [lindex [sc_cfg_tool_task_get var rtlmp_bus_planning] 0]
56
+ if { $rtlmp_bus_planning == "true" } {
57
+ lappend rtlmp_args -bus_planning
58
+ }
59
+ set rtlmp_target_dead_space [lindex [sc_cfg_tool_task_get var rtlmp_target_dead_space] 0]
60
+ if { $rtlmp_target_dead_space != "" } {
61
+ lappend rtlmp_args -target_dead_space $rtlmp_target_dead_space
62
+ }
110
63
 
111
- macro_placement \
112
- -halo [sc_cfg_tool_task_get var macro_place_halo] \
113
- -channel [sc_cfg_tool_task_get var macro_place_channel]
64
+ set rtlmp_area_weight [lindex [sc_cfg_tool_task_get var rtlmp_area_weight] 0]
65
+ if { $rtlmp_area_weight != "" } {
66
+ lappend rtlmp_args -area_weight $rtlmp_area_weight
67
+ }
68
+ set rtlmp_outline_weight [lindex [sc_cfg_tool_task_get var rtlmp_outline_weight] 0]
69
+ if { $rtlmp_outline_weight != "" } {
70
+ lappend rtlmp_args -outline_weight $rtlmp_outline_weight
71
+ }
72
+ set rtlmp_wirelength_weight [lindex [sc_cfg_tool_task_get var rtlmp_wirelength_weight] 0]
73
+ if { $rtlmp_wirelength_weight != "" } {
74
+ lappend rtlmp_args -wirelength_weight $rtlmp_wirelength_weight
114
75
  }
76
+ set rtlmp_guidance_weight [lindex [sc_cfg_tool_task_get var rtlmp_guidance_weight] 0]
77
+ if { $rtlmp_guidance_weight != "" } {
78
+ lappend rtlmp_args -guidance_weight $rtlmp_guidance_weight
79
+ }
80
+ set rtlmp_fence_weight [lindex [sc_cfg_tool_task_get var rtlmp_fence_weight] 0]
81
+ if { $rtlmp_fence_weight != "" } {
82
+ lappend rtlmp_args -fence_weight $rtlmp_fence_weight
83
+ }
84
+ set rtlmp_notch_weight [lindex [sc_cfg_tool_task_get var rtlmp_notch_weight] 0]
85
+ if { $rtlmp_notch_weight != "" } {
86
+ lappend rtlmp_args -notch_weight $rtlmp_notch_weight
87
+ }
88
+ set rtlmp_blockage_weight [lindex [sc_cfg_tool_task_get var rtlmp_blockage_weight] 0]
89
+ if { $rtlmp_blockage_weight != "" } {
90
+ lappend rtlmp_args -blockage_weight $rtlmp_blockage_weight
91
+ }
92
+
93
+ rtl_macro_placer \
94
+ -report_directory reports/rtlmp \
95
+ -halo_width $halo_x \
96
+ -halo_height $halo_y \
97
+ -target_util [sc_global_placement_density] \
98
+ {*}$rtlmp_args
115
99
  }
116
100
 
117
101
  sc_print_macro_information
@@ -47,10 +47,20 @@ foreach net [sc_supply_nets] {
47
47
 
48
48
  foreach net [sc_psm_check_nets] {
49
49
  puts "Check supply net: $net"
50
+
51
+ set check_args []
52
+ if {
53
+ [sc_check_version 18610] &&
54
+ [sc_cfg_tool_task_check_in_list $net var psm_allow_missing_terminal_nets]
55
+ } {
56
+ lappend check_args -dont_require_terminals
57
+ }
58
+
50
59
  check_power_grid \
51
60
  -floorplanning \
52
61
  -error_file "reports/power_grid_${net}.rpt" \
53
- -net $net
62
+ -net $net \
63
+ {*}$check_args
54
64
  }
55
65
 
56
66
  ###############################
@@ -28,6 +28,8 @@ estimate_parasitics -placement
28
28
  # Repair DRVs
29
29
  ###############################
30
30
 
31
+ sc_set_dont_use -scanchain -multibit -report dont_use.repair_drv
32
+
31
33
  set repair_design_args []
32
34
 
33
35
  set rsz_cap_margin [lindex [sc_cfg_tool_task_get {var} rsz_cap_margin] 0]
@@ -43,6 +45,8 @@ repair_design \
43
45
  -verbose \
44
46
  {*}$repair_design_args
45
47
 
48
+ sc_set_dont_use
49
+
46
50
  ###############################
47
51
  # Tie-off cell insertion
48
52
  ###############################
@@ -34,6 +34,9 @@ if { [lindex [sc_cfg_tool_task_get var rsz_skip_setup_repair] 0] != "true" } {
34
34
  # Setup Repair
35
35
  ###############################
36
36
 
37
+ # Enable ffs for resizing
38
+ sc_set_dont_use -scanchain -multibit -report dont_use.repair_timing.setup
39
+
37
40
  estimate_parasitics -placement
38
41
 
39
42
  repair_timing \
@@ -45,6 +48,9 @@ if { [lindex [sc_cfg_tool_task_get var rsz_skip_setup_repair] 0] != "true" } {
45
48
  {*}$repair_timing_args
46
49
 
47
50
  sc_detailed_placement
51
+
52
+ # Restore dont use
53
+ sc_set_dont_use
48
54
  }
49
55
 
50
56
  if { [lindex [sc_cfg_tool_task_get var rsz_skip_hold_repair] 0] != "true" } {
@@ -55,7 +61,7 @@ if { [lindex [sc_cfg_tool_task_get var rsz_skip_hold_repair] 0] != "true" } {
55
61
  estimate_parasitics -placement
56
62
 
57
63
  # Enable hold cells
58
- sc_set_dont_use -hold
64
+ sc_set_dont_use -hold -scanchain -multibit -report dont_use.repair_timing.hold
59
65
 
60
66
  repair_timing \
61
67
  -hold \
@@ -300,6 +300,23 @@ proc sc_bterm_has_placed_io { net } {
300
300
  return false
301
301
  }
302
302
 
303
+ ###########################
304
+ # Get nets with unplaced bterms
305
+ ###########################
306
+
307
+ proc sc_get_unplaced_io_nets { } {
308
+ set nets []
309
+ foreach bterm [[ord::get_db_block] getBTerms] {
310
+ if {
311
+ [$bterm getFirstPinPlacementStatus] == "UNPLACED" ||
312
+ [$bterm getFirstPinPlacementStatus] == "NONE"
313
+ } {
314
+ lappend nets [$bterm getNet]
315
+ }
316
+ }
317
+ return $nets
318
+ }
319
+
303
320
  ###########################
304
321
  # Find nets regex
305
322
  ###########################
@@ -564,7 +581,7 @@ proc sc_setup_sta { } {
564
581
 
565
582
  # Check timing setup
566
583
  if { [sc_cfg_tool_task_check_in_list check_setup var reports] } {
567
- check_setup
584
+ tee -file "reports/check_timing_setup.rpt" {check_setup -verbose}
568
585
  }
569
586
 
570
587
  if { [llength [all_clocks]] == 0 } {
@@ -701,13 +718,17 @@ proc sc_set_gui_title { } {
701
718
 
702
719
  proc sc_set_dont_use { args } {
703
720
  sta::parse_key_args "sc_set_dont_use" args \
704
- keys {} \
705
- flags {-hold -clock}
721
+ keys {-report} \
722
+ flags {-hold -clock -multibit -scanchain}
706
723
 
707
724
  sta::check_argc_eq0 "sc_set_dont_use" $args
708
725
 
709
726
  global sc_mainlib
710
727
 
728
+ if { [sc_check_version 18171] } {
729
+ reset_dont_use
730
+ }
731
+
711
732
  set_dont_use [sc_cfg_get library $sc_mainlib asic cells dontuse]
712
733
 
713
734
  set clk_groups "clkbuf clkgate clklogic"
@@ -724,4 +745,19 @@ proc sc_set_dont_use { args } {
724
745
  unset_dont_use [sc_cfg_get library $sc_mainlib asic cells $group]
725
746
  }
726
747
  }
748
+ if { [info exists flags(-clock)] } {
749
+ foreach group $clk_groups {
750
+ unset_dont_use [sc_cfg_get library $sc_mainlib asic cells $group]
751
+ }
752
+ }
753
+ if { [info exists flags(-multibit)] } {
754
+ unset_dont_use [sc_cfg_tool_task_get var multibit_ff_cells]
755
+ }
756
+ if { [info exists flags(-scanchain)] } {
757
+ unset_dont_use [sc_cfg_tool_task_get var scan_chain_cells]
758
+ }
759
+
760
+ if { [info exists keys(-report)] } {
761
+ tee -file reports/$keys(-report).rpt {report_dont_use}
762
+ }
727
763
  }
@@ -98,6 +98,10 @@ if { [sc_cfg_tool_task_check_in_list fmax var reports] } {
98
98
  }
99
99
  }
100
100
 
101
+ if { [llength [all_clocks]] > 0 } {
102
+ tee -file "reports/timing/clocks.rpt" {report_clock_properties}
103
+ }
104
+
101
105
  # get logic depth of design
102
106
  utl::metric_int "design__logic__depth" [sc_count_logic_depth]
103
107
 
@@ -1,5 +1,2 @@
1
- write_db "outputs/${sc_design}.odb"
2
- write_sdc "outputs/${sc_design}.sdc"
3
-
4
- write_def "outputs/${sc_design}.def"
5
- write_verilog -include_pwr_gnd "outputs/${sc_design}.vg"
1
+ source "$sc_refdir/common/write_data_physical.tcl"
2
+ source "$sc_refdir/common/write_data_timing.tcl"
@@ -0,0 +1,3 @@
1
+ write_db "outputs/${sc_design}.odb"
2
+ write_def "outputs/${sc_design}.def"
3
+ write_verilog -include_pwr_gnd "outputs/${sc_design}.vg"
@@ -0,0 +1 @@
1
+ write_sdc "outputs/${sc_design}.sdc"
@@ -93,6 +93,10 @@ proc sc_image_everything { } {
93
93
  }
94
94
 
95
95
  proc sc_image_irdrop { net corner } {
96
+ if { ![sc_cfg_tool_task_check_in_list power var reports] } {
97
+ return
98
+ }
99
+
96
100
  if { ![sc_has_placed_instances] || [sc_has_unplaced_instances] } {
97
101
  return
98
102
  }
@@ -107,7 +111,12 @@ proc sc_image_irdrop { net corner } {
107
111
  foreach msg $msgs {
108
112
  suppress_message PSM $msg
109
113
  }
110
- set failed [catch { analyze_power_grid -net $net -corner $corner -source_type STRAPS } err]
114
+ set analyze_args []
115
+ lappend analyze_args -source_type STRAPS
116
+ if { [sc_check_version 18074] } {
117
+ lappend analyze_args -allow_reuse
118
+ }
119
+ set failed [catch { analyze_power_grid -net $net -corner $corner {*}$analyze_args } err]
111
120
  foreach msg $msgs {
112
121
  unsuppress_message PSM $msg
113
122
  }
@@ -180,5 +180,5 @@ utl::pop_metrics_stage
180
180
  ###############################
181
181
 
182
182
  utl::push_metrics_stage "sc__write__{}"
183
- source "$sc_refdir/common/write_data.tcl"
183
+ source "$sc_refdir/common/write_data_physical.tcl"
184
184
  utl::pop_metrics_stage
@@ -8,7 +8,7 @@ Sources: https://github.com/The-OpenROAD-Project/OpenSTA
8
8
  Installation: https://github.com/The-OpenROAD-Project/OpenSTA (also installed with OpenROAD)
9
9
  '''
10
10
 
11
- import os
11
+ from siliconcompiler import utils
12
12
  from siliconcompiler.tools.openroad._apr import get_library_timing_keypaths
13
13
  from siliconcompiler.tools._common import get_tool_task
14
14
  from siliconcompiler.tools._common.asic import get_libraries
@@ -43,7 +43,7 @@ def setup(chip):
43
43
  chip.set('tool', tool, 'task', task, 'refdir', 'tools/opensta/scripts',
44
44
  step=step, index=index,
45
45
  package='siliconcompiler', clobber=False)
46
- chip.set('tool', tool, 'task', task, 'threads', os.cpu_count(),
46
+ chip.set('tool', tool, 'task', task, 'threads', utils.get_cores(chip),
47
47
  step=step, index=index, clobber=False)
48
48
 
49
49
  if delaymodel != 'nldm':
@@ -1,4 +1,4 @@
1
- import os
1
+ from siliconcompiler import utils
2
2
  from siliconcompiler.tools.opensta import setup as tool_setup
3
3
  from siliconcompiler.tools.opensta import runtime_options as tool_runtime_options
4
4
  from siliconcompiler.tools._common import get_tool_task
@@ -17,7 +17,7 @@ def setup(chip):
17
17
  chip.set('tool', tool, 'task', task, 'script', 'sc_report_libraries.tcl',
18
18
  step=step, index=index, clobber=False)
19
19
 
20
- chip.set('tool', tool, 'task', task, 'threads', os.cpu_count(),
20
+ chip.set('tool', tool, 'task', task, 'threads', utils.get_cores(chip),
21
21
  step=step, index=index)
22
22
 
23
23
 
@@ -1,5 +1,6 @@
1
1
  import os
2
2
  import re
3
+ from siliconcompiler import utils
3
4
  from siliconcompiler import sc_open, SiliconCompilerError
4
5
  from siliconcompiler.tools.opensta import setup as tool_setup
5
6
  from siliconcompiler.tools.opensta import runtime_options as tool_runtime_options
@@ -22,7 +23,7 @@ def setup(chip):
22
23
  chip.set('tool', tool, 'task', task, 'script', 'sc_timing.tcl',
23
24
  step=step, index=index, clobber=False)
24
25
 
25
- chip.set('tool', tool, 'task', task, 'threads', os.cpu_count(),
26
+ chip.set('tool', tool, 'task', task, 'threads', utils.get_cores(chip),
26
27
  step=step, index=index)
27
28
 
28
29
  design = chip.top()