librelane 3.0.0.dev23__py3-none-any.whl → 3.0.0.dev25__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.
Potentially problematic release.
This version of librelane might be problematic. Click here for more details.
- librelane/config/__main__.py +1 -4
- librelane/config/removals.py +1 -0
- librelane/config/variable.py +1 -1
- librelane/examples/spm/config.yaml +8 -8
- librelane/examples/spm-user_project_wrapper/config.json +17 -5
- librelane/scripts/odbpy/reader.py +1 -1
- librelane/scripts/openroad/common/io.tcl +38 -18
- librelane/scripts/openroad/common/pdn_cfg.tcl +38 -38
- librelane/scripts/openroad/common/set_global_connections.tcl +1 -1
- librelane/scripts/openroad/drt.tcl +3 -5
- librelane/scripts/openroad/floorplan.tcl +12 -4
- librelane/scripts/openroad/ioplacer.tcl +22 -21
- librelane/scripts/openroad/pdn.tcl +1 -1
- librelane/scripts/openroad/sta/check_macro_instances.tcl +3 -3
- librelane/scripts/openroad/sta/corner.tcl +8 -8
- librelane/scripts/pyosys/json_header.py +1 -2
- librelane/scripts/pyosys/synthesize.py +4 -4
- librelane/scripts/pyosys/ys_common.py +9 -29
- librelane/state/design_format.py +7 -0
- librelane/steps/common_variables.py +82 -33
- librelane/steps/odb.py +26 -38
- librelane/steps/openroad.py +36 -43
- librelane/steps/pyosys.py +14 -9
- librelane/steps/yosys.py +16 -6
- {librelane-3.0.0.dev23.dist-info → librelane-3.0.0.dev25.dist-info}/METADATA +1 -1
- {librelane-3.0.0.dev23.dist-info → librelane-3.0.0.dev25.dist-info}/RECORD +28 -28
- {librelane-3.0.0.dev23.dist-info → librelane-3.0.0.dev25.dist-info}/WHEEL +0 -0
- {librelane-3.0.0.dev23.dist-info → librelane-3.0.0.dev25.dist-info}/entry_points.txt +0 -0
librelane/config/__main__.py
CHANGED
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
import os
|
|
15
15
|
import sys
|
|
16
16
|
import json
|
|
17
|
-
import functools
|
|
18
17
|
from decimal import Decimal
|
|
19
18
|
|
|
20
19
|
import click
|
|
@@ -111,9 +110,7 @@ def create_config(
|
|
|
111
110
|
print("At least one source RTL file is required.", file=sys.stderr)
|
|
112
111
|
exit(1)
|
|
113
112
|
source_rtl_key = "VERILOG_FILES"
|
|
114
|
-
if not
|
|
115
|
-
lambda acc, x: acc and (x.endswith(".sv") or x.endswith(".v")), source_rtl, True
|
|
116
|
-
):
|
|
113
|
+
if not all((file.endswith(".sv") or file.endswith(".v")) for file in source_rtl):
|
|
117
114
|
print(
|
|
118
115
|
"Only Verilog/SystemVerilog files are supported by create-config.",
|
|
119
116
|
file=sys.stderr,
|
librelane/config/removals.py
CHANGED
librelane/config/variable.py
CHANGED
|
@@ -575,7 +575,7 @@ class Variable:
|
|
|
575
575
|
kwargs_dict = {}
|
|
576
576
|
for current_field in fields(validating_type):
|
|
577
577
|
key = current_field.name
|
|
578
|
-
subtype = current_field.type
|
|
578
|
+
subtype: Type[Any] = current_field.type # type: ignore
|
|
579
579
|
explicitly_specified = False
|
|
580
580
|
if key in raw:
|
|
581
581
|
explicitly_specified = True
|
|
@@ -7,16 +7,16 @@ PNR_SDC_FILE: dir::src/impl.sdc
|
|
|
7
7
|
SIGNOFF_SDC_FILE: dir::src/signoff.sdc
|
|
8
8
|
|
|
9
9
|
# PDN
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
PDN_VOFFSET: 5
|
|
11
|
+
PDN_HOFFSET: 5
|
|
12
|
+
PDN_VWIDTH: 2
|
|
13
|
+
PDN_HWIDTH: 2
|
|
14
|
+
PDN_VPITCH: 30
|
|
15
|
+
PDN_HPITCH: 30
|
|
16
|
+
PDN_SKIPTRIM: true
|
|
17
17
|
|
|
18
18
|
# Pin Order
|
|
19
|
-
|
|
19
|
+
IO_PIN_ORDER_CFG: dir::pin_order.cfg
|
|
20
20
|
|
|
21
21
|
# Technology-Specific Configs
|
|
22
22
|
pdk::sky130*:
|
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"DESIGN_NAME": "SPM_example",
|
|
3
|
-
"VERILOG_FILES": [
|
|
3
|
+
"VERILOG_FILES": [
|
|
4
|
+
"dir::./defines.v",
|
|
5
|
+
"dir::./SPM_example.v"
|
|
6
|
+
],
|
|
4
7
|
"CLOCK_PERIOD": 25,
|
|
5
8
|
"CLOCK_PORT": "wb_clk_i",
|
|
6
9
|
"CLOCK_NET": "SPM.clk",
|
|
7
10
|
"RT_MAX_LAYER": "met4",
|
|
8
11
|
"FP_SIZING": "absolute",
|
|
9
|
-
"VDD_NETS": [
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"
|
|
12
|
+
"VDD_NETS": [
|
|
13
|
+
"vccd1"
|
|
14
|
+
],
|
|
15
|
+
"GND_NETS": [
|
|
16
|
+
"vssd1"
|
|
17
|
+
],
|
|
18
|
+
"PDN_MULTILAYER": false,
|
|
19
|
+
"DIE_AREA": [
|
|
20
|
+
0,
|
|
21
|
+
0,
|
|
22
|
+
600,
|
|
23
|
+
600
|
|
24
|
+
]
|
|
13
25
|
}
|
|
@@ -166,7 +166,7 @@ class OdbReader(object):
|
|
|
166
166
|
grt.setMinLayerForClock(min_clk_idx)
|
|
167
167
|
grt.setMaxLayerForClock(max_clk_idx)
|
|
168
168
|
grt.setMacroExtension(self.config["GRT_MACRO_EXTENSION"])
|
|
169
|
-
grt.
|
|
169
|
+
grt.setCongestionIterations(self.config["GRT_OVERFLOW_ITERS"])
|
|
170
170
|
grt.setAllowCongestion(self.config["GRT_ALLOW_CONGESTION"])
|
|
171
171
|
grt.setVerbose(True)
|
|
172
172
|
grt.initFastRoute(min_layer_idx, max_layer_idx)
|
|
@@ -99,23 +99,35 @@ proc read_pdn_cfg {} {
|
|
|
99
99
|
|
|
100
100
|
# Compatibility Layer for Deprecated Variables That May Still Be Used By
|
|
101
101
|
# User Files
|
|
102
|
-
set
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
102
|
+
set unset_list {
|
|
103
|
+
DESIGN_IS_CORE
|
|
104
|
+
PDN_ENABLE_MACROS_GRID
|
|
105
|
+
PDN_RAILS_LAYER
|
|
106
|
+
PDN_UPPER_LAYER
|
|
107
|
+
PDN_LOWER_LAYER
|
|
108
|
+
}
|
|
109
|
+
set ::env(DESIGN_IS_CORE) $::env(PDN_MULTILAYER)
|
|
110
|
+
set ::env(PDN_ENABLE_MACROS_GRID) $::env(PDN_CONNECT_MACROS_TO_GRID)
|
|
111
|
+
set ::env(PDN_RAILS_LAYER) $::env(PDN_RAIL_LAYER)
|
|
112
|
+
set ::env(PDN_UPPER_LAYER) $::env(PDN_HORIZONTAL_LAYER)
|
|
113
|
+
set ::env(PDN_LOWER_LAYER) $::env(PDN_VERTICAL_LAYER)
|
|
114
|
+
foreach key [array names ::env] {
|
|
115
|
+
if { [string match PDN_* $key] } {
|
|
116
|
+
set fp_name FP_$key
|
|
117
|
+
lappend unset_list $fp_name
|
|
118
|
+
set ::env($fp_name) $::env($key)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
107
121
|
|
|
108
|
-
if {[catch {source $::env(
|
|
122
|
+
if {[catch {source $::env(PDN_CFG)} errmsg]} {
|
|
109
123
|
puts stderr $errmsg
|
|
110
124
|
exit 1
|
|
111
125
|
}
|
|
112
126
|
|
|
113
127
|
# Restore Environment
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
unset ::env(FP_PDN_UPPER_LAYER)
|
|
118
|
-
unset ::env(FP_PDN_LOWER_LAYER)
|
|
128
|
+
foreach unsettable $unset_list {
|
|
129
|
+
unset ::env($unsettable)
|
|
130
|
+
}
|
|
119
131
|
}
|
|
120
132
|
|
|
121
133
|
|
|
@@ -174,9 +186,9 @@ proc read_timing_info {args} {
|
|
|
174
186
|
foreach nl $::env(_CURRENT_CORNER_NETLISTS) {
|
|
175
187
|
puts "Reading macro netlist at '$nl'…"
|
|
176
188
|
if { [catch {read_verilog $nl} err] } {
|
|
177
|
-
puts "Error while reading macro netlist '$nl':"
|
|
178
|
-
puts $err
|
|
179
|
-
puts "Make sure that this a gate-level netlist and not an RTL file."
|
|
189
|
+
puts stderr "Error while reading macro netlist '$nl':"
|
|
190
|
+
puts stderr $err
|
|
191
|
+
puts stderr "Make sure that this a gate-level netlist and not an RTL file."
|
|
180
192
|
exit 1
|
|
181
193
|
}
|
|
182
194
|
}
|
|
@@ -185,9 +197,9 @@ proc read_timing_info {args} {
|
|
|
185
197
|
if { [string_in_file $verilog_file $blackbox_wildcard] } {
|
|
186
198
|
puts "Found '$blackbox_wildcard' in '$verilog_file', skipping…"
|
|
187
199
|
} elseif { [catch {puts "Reading Verilog model at '$verilog_file'…"; read_verilog $verilog_file} err] } {
|
|
188
|
-
puts "Error while reading $verilog_file:"
|
|
189
|
-
puts $err
|
|
190
|
-
puts "Make sure that this a gate-level netlist and not an RTL file, otherwise, you can add the following comment '$blackbox_wildcard' in the file to skip it and blackbox the modules inside if needed."
|
|
200
|
+
puts stderr "Error while reading $verilog_file:"
|
|
201
|
+
puts stderr $err
|
|
202
|
+
puts stderr "Make sure that this a gate-level netlist and not an RTL file, otherwise, you can add the following comment '$blackbox_wildcard' in the file to skip it and blackbox the modules inside if needed."
|
|
191
203
|
exit 1
|
|
192
204
|
}
|
|
193
205
|
}
|
|
@@ -411,6 +423,13 @@ proc write_views {args} {
|
|
|
411
423
|
write_verilog $::env(SAVE_NL)
|
|
412
424
|
}
|
|
413
425
|
|
|
426
|
+
if { [info exists ::env(SAVE_LOGICAL_NL)] } {
|
|
427
|
+
puts "Writing logic-only netlist to '$::env(SAVE_LOGICAL_NL)'…"
|
|
428
|
+
write_verilog\
|
|
429
|
+
-remove_cells "[get_physical_cells]"\
|
|
430
|
+
$::env(SAVE_LOGICAL_NL)
|
|
431
|
+
}
|
|
432
|
+
|
|
414
433
|
if { [info exists ::env(SAVE_PNL)] } {
|
|
415
434
|
puts "Writing powered netlist to '$::env(SAVE_PNL)'…"
|
|
416
435
|
write_verilog -include_pwr_gnd $::env(SAVE_PNL)
|
|
@@ -575,7 +594,8 @@ proc get_layers {args} {
|
|
|
575
594
|
flags {-constrained}
|
|
576
595
|
|
|
577
596
|
if { ![info exists keys(-types)] } {
|
|
578
|
-
puts "\[ERROR\] Invalid usage of get_layers: -types is required."
|
|
597
|
+
puts stderr "\[ERROR\] Invalid usage of get_layers: -types is required."
|
|
598
|
+
return -code error
|
|
579
599
|
}
|
|
580
600
|
|
|
581
601
|
set layers [$::tech getLayers]
|
|
@@ -43,83 +43,83 @@ foreach vdd $::env(VDD_NETS) gnd $::env(GND_NETS) {
|
|
|
43
43
|
set_voltage_domain -name CORE -power $::env(VDD_NET) -ground $::env(GND_NET) \
|
|
44
44
|
-secondary_power $secondary
|
|
45
45
|
|
|
46
|
-
if { $::env(
|
|
46
|
+
if { $::env(PDN_MULTILAYER) == 1 } {
|
|
47
47
|
define_pdn_grid \
|
|
48
48
|
-name stdcell_grid \
|
|
49
49
|
-starts_with POWER \
|
|
50
50
|
-voltage_domain CORE \
|
|
51
|
-
-pins "$::env(
|
|
51
|
+
-pins "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
|
|
52
52
|
|
|
53
53
|
add_pdn_stripe \
|
|
54
54
|
-grid stdcell_grid \
|
|
55
|
-
-layer $::env(
|
|
56
|
-
-width $::env(
|
|
57
|
-
-pitch $::env(
|
|
58
|
-
-offset $::env(
|
|
59
|
-
-spacing $::env(
|
|
55
|
+
-layer $::env(PDN_VERTICAL_LAYER) \
|
|
56
|
+
-width $::env(PDN_VWIDTH) \
|
|
57
|
+
-pitch $::env(PDN_VPITCH) \
|
|
58
|
+
-offset $::env(PDN_VOFFSET) \
|
|
59
|
+
-spacing $::env(PDN_VSPACING) \
|
|
60
60
|
-starts_with POWER -extend_to_core_ring
|
|
61
61
|
|
|
62
62
|
add_pdn_stripe \
|
|
63
63
|
-grid stdcell_grid \
|
|
64
|
-
-layer $::env(
|
|
65
|
-
-width $::env(
|
|
66
|
-
-pitch $::env(
|
|
67
|
-
-offset $::env(
|
|
68
|
-
-spacing $::env(
|
|
64
|
+
-layer $::env(PDN_HORIZONTAL_LAYER) \
|
|
65
|
+
-width $::env(PDN_HWIDTH) \
|
|
66
|
+
-pitch $::env(PDN_HPITCH) \
|
|
67
|
+
-offset $::env(PDN_HOFFSET) \
|
|
68
|
+
-spacing $::env(PDN_HSPACING) \
|
|
69
69
|
-starts_with POWER -extend_to_core_ring
|
|
70
70
|
|
|
71
71
|
add_pdn_connect \
|
|
72
72
|
-grid stdcell_grid \
|
|
73
|
-
-layers "$::env(
|
|
73
|
+
-layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
|
|
74
74
|
} else {
|
|
75
75
|
define_pdn_grid \
|
|
76
76
|
-name stdcell_grid \
|
|
77
77
|
-starts_with POWER \
|
|
78
78
|
-voltage_domain CORE \
|
|
79
|
-
-pins $::env(
|
|
79
|
+
-pins $::env(PDN_VERTICAL_LAYER)
|
|
80
80
|
|
|
81
81
|
add_pdn_stripe \
|
|
82
82
|
-grid stdcell_grid \
|
|
83
|
-
-layer $::env(
|
|
84
|
-
-width $::env(
|
|
85
|
-
-pitch $::env(
|
|
86
|
-
-offset $::env(
|
|
87
|
-
-spacing $::env(
|
|
83
|
+
-layer $::env(PDN_VERTICAL_LAYER) \
|
|
84
|
+
-width $::env(PDN_VWIDTH) \
|
|
85
|
+
-pitch $::env(PDN_VPITCH) \
|
|
86
|
+
-offset $::env(PDN_VOFFSET) \
|
|
87
|
+
-spacing $::env(PDN_VSPACING) \
|
|
88
88
|
-starts_with POWER -extend_to_core_ring
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
# Adds the standard cell rails if enabled.
|
|
92
|
-
if { $::env(
|
|
92
|
+
if { $::env(PDN_ENABLE_RAILS) == 1 } {
|
|
93
93
|
add_pdn_stripe \
|
|
94
94
|
-grid stdcell_grid \
|
|
95
|
-
-layer $::env(
|
|
96
|
-
-width $::env(
|
|
97
|
-
-followpins
|
|
98
|
-
-starts_with POWER
|
|
95
|
+
-layer $::env(PDN_RAIL_LAYER) \
|
|
96
|
+
-width $::env(PDN_RAIL_WIDTH) \
|
|
97
|
+
-followpins
|
|
99
98
|
|
|
100
99
|
add_pdn_connect \
|
|
101
100
|
-grid stdcell_grid \
|
|
102
|
-
-layers "$::env(
|
|
101
|
+
-layers "$::env(PDN_RAIL_LAYER) $::env(PDN_VERTICAL_LAYER)"
|
|
103
102
|
}
|
|
104
103
|
|
|
105
104
|
|
|
106
105
|
# Adds the core ring if enabled.
|
|
107
|
-
if { $::env(
|
|
108
|
-
if { $::env(
|
|
106
|
+
if { $::env(PDN_CORE_RING) == 1 } {
|
|
107
|
+
if { $::env(PDN_MULTILAYER) == 1 } {
|
|
109
108
|
add_pdn_ring \
|
|
109
|
+
-allow_out_of_die \
|
|
110
110
|
-grid stdcell_grid \
|
|
111
|
-
-layers "$::env(
|
|
112
|
-
-widths "$::env(
|
|
113
|
-
-spacings "$::env(
|
|
114
|
-
-core_offset "$::env(
|
|
111
|
+
-layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)" \
|
|
112
|
+
-widths "$::env(PDN_CORE_RING_VWIDTH) $::env(PDN_CORE_RING_HWIDTH)" \
|
|
113
|
+
-spacings "$::env(PDN_CORE_RING_VSPACING) $::env(PDN_CORE_RING_HSPACING)" \
|
|
114
|
+
-core_offset "$::env(PDN_CORE_RING_VOFFSET) $::env(PDN_CORE_RING_HOFFSET)"
|
|
115
115
|
} else {
|
|
116
|
-
throw APPLICATION "
|
|
116
|
+
throw APPLICATION "PDN_CORE_RING cannot be used when PDN_MULTILAYER is set to false."
|
|
117
117
|
# add_pdn_ring \
|
|
118
118
|
# -grid stdcell_grid \
|
|
119
|
-
# -layers "$::env(
|
|
120
|
-
# -widths "$::env(
|
|
121
|
-
# -spacings "$::env(
|
|
122
|
-
# -core_offset "$::env(
|
|
119
|
+
# -layers "$::env(PDN_VERTICAL_LAYER)" \
|
|
120
|
+
# -widths "$::env(PDN_CORE_RING_VWIDTH)" \
|
|
121
|
+
# -spacings "$::env(PDN_CORE_RING_VSPACING)" \
|
|
122
|
+
# -core_offset "$::env(PDN_CORE_RING_VOFFSET)"
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
|
|
@@ -128,8 +128,8 @@ define_pdn_grid \
|
|
|
128
128
|
-default \
|
|
129
129
|
-name macro \
|
|
130
130
|
-starts_with POWER \
|
|
131
|
-
-halo "$::env(
|
|
131
|
+
-halo "$::env(PDN_HORIZONTAL_HALO) $::env(PDN_VERTICAL_HALO)"
|
|
132
132
|
|
|
133
133
|
add_pdn_connect \
|
|
134
134
|
-grid macro \
|
|
135
|
-
-layers "$::env(
|
|
135
|
+
-layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
|
|
@@ -56,7 +56,7 @@ proc set_global_connections {} {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
if { $matched != 1 } {
|
|
59
|
-
puts "\[ERROR\] No match found for regular expression '$instance_name' defined in PDN_MACRO_CONNECTIONS."
|
|
59
|
+
puts stderr "\[ERROR\] No match found for regular expression '$instance_name' defined in PDN_MACRO_CONNECTIONS."
|
|
60
60
|
exit_unless_gui 1
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -17,8 +17,8 @@ proc drt_run {i args} {
|
|
|
17
17
|
set output_drc "-output_drc $::env(STEP_DIR)/$directory/$::env(DESIGN_NAME).drc"
|
|
18
18
|
log_cmd detailed_route {*}$args {*}$output_drc
|
|
19
19
|
if { $::env(DRT_SAVE_SNAPSHOTS) } {
|
|
20
|
-
foreach snapshot [glob -nocomplain drt_iter*.odb] {
|
|
21
|
-
file rename -force $snapshot
|
|
20
|
+
foreach snapshot [glob -nocomplain $::env(STEP_DIR)/drt_iter*.odb] {
|
|
21
|
+
file rename -force $snapshot $::env(STEP_DIR)/$directory/[file tail $snapshot]
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
foreach drc_file [glob -nocomplain $::env(STEP_DIR)/$directory/*.drc] {
|
|
@@ -41,13 +41,11 @@ set max_layer $::env(RT_MAX_LAYER)
|
|
|
41
41
|
if { [info exists ::env(DRT_MAX_LAYER)] } {
|
|
42
42
|
set max_layer $::env(DRT_MAX_LAYER)
|
|
43
43
|
}
|
|
44
|
-
if { $::env(DRT_SAVE_SNAPSHOTS) } {
|
|
45
|
-
set_debug_level DRT snapshot 1
|
|
46
|
-
}
|
|
47
44
|
set drc_report_iter_step_arg ""
|
|
48
45
|
if { $::env(DRT_SAVE_SNAPSHOTS) } {
|
|
49
46
|
set_debug_level DRT snapshot 1
|
|
50
47
|
set drc_report_iter_step_arg "-drc_report_iter_step 1"
|
|
48
|
+
detailed_route_debug -snapshot_dir "$::env(STEP_DIR)/$directory"
|
|
51
49
|
}
|
|
52
50
|
if { [info exists ::env(DRT_SAVE_DRC_REPORT_ITERS)] } {
|
|
53
51
|
set drc_report_iter_step_arg "-drc_report_iter_step $::env(DRT_SAVE_DRC_REPORT_ITERS)"
|
|
@@ -33,10 +33,18 @@ puts "Using site height: $::default_site_height and site width: $::default_site_
|
|
|
33
33
|
|
|
34
34
|
unset_propagated_clock [all_clocks]
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
set
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
proc set_margin {var site_dimension mult} {
|
|
37
|
+
set value [expr $site_dimension * $mult]
|
|
38
|
+
if { $value < 0 } {
|
|
39
|
+
puts stderr "\[ERROR IFP-0013\] Negative values not allowed for margins."
|
|
40
|
+
exit_unless_gui 1
|
|
41
|
+
}
|
|
42
|
+
uplevel 1 set "$var $value"
|
|
43
|
+
}
|
|
44
|
+
set_margin bottom_margin $::default_site_height $::env(BOTTOM_MARGIN_MULT)
|
|
45
|
+
set_margin top_margin $::default_site_height $::env(TOP_MARGIN_MULT)
|
|
46
|
+
set_margin left_margin $::default_site_width $::env(LEFT_MARGIN_MULT)
|
|
47
|
+
set_margin right_margin $::default_site_width $::env(RIGHT_MARGIN_MULT)
|
|
40
48
|
|
|
41
49
|
set arg_list [list]
|
|
42
50
|
|
|
@@ -15,50 +15,51 @@ source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
|
15
15
|
read_current_odb
|
|
16
16
|
|
|
17
17
|
if { [info exists ::env(CONTEXTUAL_IO_FLAG)] } {
|
|
18
|
-
|
|
18
|
+
read_lef $::env(placement_tmpfiles)/top_level.lef
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
if { [info exists ::env(
|
|
22
|
-
|
|
21
|
+
if { [info exists ::env(IO_PIN_H_LENGTH)] } {
|
|
22
|
+
set_pin_length -hor_length $::env(IO_PIN_H_LENGTH)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
if { [info exists ::env(
|
|
26
|
-
|
|
25
|
+
if { [info exists ::env(IO_PIN_V_LENGTH)] } {
|
|
26
|
+
set_pin_length -ver_length $::env(IO_PIN_V_LENGTH)
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
if { $::env(
|
|
30
|
-
|
|
29
|
+
if { $::env(IO_PIN_H_EXTENSION) != "0"} {
|
|
30
|
+
set_pin_length_extension -hor_extension $::env(IO_PIN_H_EXTENSION)
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
if { $::env(
|
|
34
|
-
|
|
33
|
+
if { $::env(IO_PIN_V_EXTENSION) != "0"} {
|
|
34
|
+
set_pin_length_extension -ver_extension $::env(IO_PIN_V_EXTENSION)
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
if {$::env(
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
if {$::env(IO_PIN_V_THICKNESS_MULT) != "" && $::env(IO_PIN_H_THICKNESS_MULT) != ""} {
|
|
38
|
+
set_pin_thick_multiplier\
|
|
39
|
+
-hor_multiplier $::env(IO_PIN_H_THICKNESS_MULT) \
|
|
40
|
+
-ver_multiplier $::env(IO_PIN_V_THICKNESS_MULT)
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
set arg_list [list]
|
|
43
|
-
if { $::env(
|
|
44
|
-
|
|
44
|
+
if { $::env(IO_PIN_PLACEMENT_MODE) == "random_equidistant" } {
|
|
45
|
+
lappend arg_list -random
|
|
45
46
|
}
|
|
46
47
|
|
|
47
|
-
if { [info exists ::env(
|
|
48
|
-
|
|
48
|
+
if { [info exists ::env(IO_PIN_MIN_DISTANCE)] } {
|
|
49
|
+
lappend arg_list -min_distance $::env(IO_PIN_MIN_DISTANCE)
|
|
49
50
|
}
|
|
50
51
|
|
|
51
|
-
if { $::env(
|
|
52
|
-
|
|
52
|
+
if { $::env(IO_PIN_PLACEMENT_MODE) == "annealing" } {
|
|
53
|
+
lappend arg_list -annealing
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
set HMETAL $::env(FP_IO_HLAYER)
|
|
56
57
|
set VMETAL $::env(FP_IO_VLAYER)
|
|
57
58
|
|
|
58
59
|
log_cmd place_pins {*}$arg_list \
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
-random_seed 42 \
|
|
61
|
+
-hor_layers $HMETAL \
|
|
62
|
+
-ver_layers $VMETAL
|
|
62
63
|
|
|
63
64
|
write_views
|
|
64
65
|
|
|
@@ -30,10 +30,10 @@ foreach {instance_name macro_name} $::env(_check_macro_instances) {
|
|
|
30
30
|
set instances [get_cells -hierarchical $instance_name]
|
|
31
31
|
set instance_count [llength $instances]
|
|
32
32
|
if { $instance_count < 1 } {
|
|
33
|
-
puts "\[ERROR\] No macro instance $instance_name found."
|
|
33
|
+
puts stderr "\[ERROR\] No macro instance $instance_name found."
|
|
34
34
|
incr error_count
|
|
35
35
|
} elseif { $instance_count > 1 } {
|
|
36
|
-
puts "\[ERROR\] Macro instance name $instance_name matches multiple cells."
|
|
36
|
+
puts stderr "\[ERROR\] Macro instance name $instance_name matches multiple cells."
|
|
37
37
|
incr error_count
|
|
38
38
|
} else {
|
|
39
39
|
# The next line doesn't actually matter because this is Tcl but I'd feel
|
|
@@ -42,7 +42,7 @@ foreach {instance_name macro_name} $::env(_check_macro_instances) {
|
|
|
42
42
|
|
|
43
43
|
set master_name [get_property $instance ref_name]
|
|
44
44
|
if { $master_name != $macro_name } {
|
|
45
|
-
puts "\[ERROR\] Instance $instance_name is configured as an instance of macro $macro_name, but is an instance of $master_name."
|
|
45
|
+
puts stderr "\[ERROR\] Instance $instance_name is configured as an instance of macro $macro_name, but is an instance of $master_name."
|
|
46
46
|
incr error_count
|
|
47
47
|
}
|
|
48
48
|
}
|
|
@@ -54,7 +54,7 @@ puts "\n========================================================================
|
|
|
54
54
|
puts "report_checks -path_delay min (Hold)"
|
|
55
55
|
puts "============================================================================"
|
|
56
56
|
puts "======================= [$corner name] Corner ===================================\n"
|
|
57
|
-
report_checks -sort_by_slack -path_delay min -fields {slew cap input
|
|
57
|
+
report_checks -sort_by_slack -path_delay min -fields {slew cap input net fanout} -format full_clock_expanded -group_path_count 1000 -corner [$corner name]
|
|
58
58
|
puts ""
|
|
59
59
|
puts "%OL_END_REPORT"
|
|
60
60
|
|
|
@@ -64,7 +64,7 @@ puts "\n========================================================================
|
|
|
64
64
|
puts "report_checks -path_delay max (Setup)"
|
|
65
65
|
puts "============================================================================"
|
|
66
66
|
puts "======================= [$corner name] Corner ===================================\n"
|
|
67
|
-
report_checks -sort_by_slack -path_delay max -fields {slew cap input
|
|
67
|
+
report_checks -sort_by_slack -path_delay max -fields {slew cap input net fanout} -format full_clock_expanded -group_path_count 1000 -corner [$corner name]
|
|
68
68
|
puts ""
|
|
69
69
|
puts "%OL_END_REPORT"
|
|
70
70
|
|
|
@@ -74,7 +74,7 @@ puts "\n========================================================================
|
|
|
74
74
|
puts "report_checks -unconstrained"
|
|
75
75
|
puts "==========================================================================="
|
|
76
76
|
puts "======================= [$corner name] Corner ===================================\n"
|
|
77
|
-
report_checks -unconstrained -fields {slew cap input
|
|
77
|
+
report_checks -unconstrained -fields {slew cap input net fanout} -format full_clock_expanded -corner [$corner name]
|
|
78
78
|
puts ""
|
|
79
79
|
|
|
80
80
|
|
|
@@ -82,7 +82,7 @@ puts "\n========================================================================
|
|
|
82
82
|
puts "report_checks --slack_max -0.01"
|
|
83
83
|
puts "============================================================================"
|
|
84
84
|
puts "======================= [$corner name] Corner ===================================\n"
|
|
85
|
-
report_checks -slack_max -0.01 -fields {slew cap input
|
|
85
|
+
report_checks -slack_max -0.01 -fields {slew cap input net fanout} -format full_clock_expanded -corner [$corner name]
|
|
86
86
|
puts ""
|
|
87
87
|
|
|
88
88
|
puts "\n==========================================================================="
|
|
@@ -260,7 +260,7 @@ if { [info exists ::env(STA_MAX_VIOLATOR_COUNT)] } {
|
|
|
260
260
|
set max_violator_count $::env(STA_MAX_VIOLATOR_COUNT)
|
|
261
261
|
}
|
|
262
262
|
|
|
263
|
-
set hold_violating_paths [find_timing_paths -unique_paths_to_endpoint -path_delay min -sort_by_slack -
|
|
263
|
+
set hold_violating_paths [find_timing_paths -unique_paths_to_endpoint -path_delay min -sort_by_slack -group_path_count $max_violator_count -slack_max 0]
|
|
264
264
|
foreach path $hold_violating_paths {
|
|
265
265
|
set start_pin [get_property $path startpoint]
|
|
266
266
|
set end_pin [get_property $path endpoint]
|
|
@@ -279,7 +279,7 @@ foreach path $hold_violating_paths {
|
|
|
279
279
|
}
|
|
280
280
|
|
|
281
281
|
set worst_r2r_hold_slack 1e30
|
|
282
|
-
set hold_paths [find_timing_paths -unique_paths_to_endpoint -path_delay min -sort_by_slack -
|
|
282
|
+
set hold_paths [find_timing_paths -unique_paths_to_endpoint -path_delay min -sort_by_slack -group_path_count $max_violator_count -slack_max $worst_r2r_hold_slack]
|
|
283
283
|
foreach path $hold_paths {
|
|
284
284
|
set start_pin [get_property $path startpoint]
|
|
285
285
|
set end_pin [get_property $path endpoint]
|
|
@@ -295,7 +295,7 @@ foreach path $hold_paths {
|
|
|
295
295
|
}
|
|
296
296
|
}
|
|
297
297
|
|
|
298
|
-
set setup_violating_paths [find_timing_paths -unique_paths_to_endpoint -path_delay max -sort_by_slack -
|
|
298
|
+
set setup_violating_paths [find_timing_paths -unique_paths_to_endpoint -path_delay max -sort_by_slack -group_path_count $max_violator_count -slack_max 0]
|
|
299
299
|
foreach path $setup_violating_paths {
|
|
300
300
|
set start_pin [get_property $path startpoint]
|
|
301
301
|
set end_pin [get_property $path endpoint]
|
|
@@ -314,7 +314,7 @@ foreach path $setup_violating_paths {
|
|
|
314
314
|
}
|
|
315
315
|
|
|
316
316
|
set worst_r2r_setup_slack 1e30
|
|
317
|
-
set setup_paths [find_timing_paths -unique_paths_to_endpoint -path_delay max -sort_by_slack -
|
|
317
|
+
set setup_paths [find_timing_paths -unique_paths_to_endpoint -path_delay max -sort_by_slack -group_path_count $max_violator_count -slack_max $worst_r2r_setup_slack]
|
|
318
318
|
foreach path $setup_paths {
|
|
319
319
|
set start_pin [get_property $path startpoint]
|
|
320
320
|
set end_pin [get_property $path endpoint]
|
|
@@ -62,8 +62,7 @@ def json_header(
|
|
|
62
62
|
synth_parameters=config["SYNTH_PARAMETERS"] or [],
|
|
63
63
|
includes=includes,
|
|
64
64
|
defines=defines,
|
|
65
|
-
|
|
66
|
-
synlig_defer=config["SYNLIG_DEFER"],
|
|
65
|
+
use_slang=config["USE_SLANG"],
|
|
67
66
|
)
|
|
68
67
|
d.run_pass(
|
|
69
68
|
"hierarchy",
|
|
@@ -262,8 +262,7 @@ def synthesize(
|
|
|
262
262
|
synth_parameters=[],
|
|
263
263
|
includes=includes,
|
|
264
264
|
defines=defines,
|
|
265
|
-
|
|
266
|
-
synlig_defer=False,
|
|
265
|
+
use_slang=False,
|
|
267
266
|
)
|
|
268
267
|
elif verilog_files := config.get("VERILOG_FILES"):
|
|
269
268
|
d.read_verilog_files(
|
|
@@ -272,8 +271,7 @@ def synthesize(
|
|
|
272
271
|
synth_parameters=config["SYNTH_PARAMETERS"] or [],
|
|
273
272
|
includes=includes,
|
|
274
273
|
defines=defines,
|
|
275
|
-
|
|
276
|
-
synlig_defer=config["SYNLIG_DEFER"],
|
|
274
|
+
use_slang=config["USE_SLANG"],
|
|
277
275
|
)
|
|
278
276
|
elif vhdl_files := config.get("VHDL_FILES"):
|
|
279
277
|
d.run_pass("plugin", "-i", "ghdl")
|
|
@@ -300,6 +298,8 @@ def synthesize(
|
|
|
300
298
|
)
|
|
301
299
|
except Exception:
|
|
302
300
|
pass
|
|
301
|
+
if config["SYNTH_NORMALIZE_SINGLE_BIT_VECTORS"]:
|
|
302
|
+
d.run_pass("attrmap", "-remove", "single_bit_vector")
|
|
303
303
|
d.run_pass("select", "-clear")
|
|
304
304
|
|
|
305
305
|
lib_arguments = []
|