mirror of
https://github.com/The-OpenROAD-Project/OpenSTA.git
synced 2026-09-01 18:36:42 +02:00
* Implement set_path_margin command Adds a new set_path_margin SDC command that applies a signed slack adjustment to the capture-clock side of timing paths. A positive margin tightens the path (harder to meet) and a negative margin loosens it. Supports -setup/-hold/-from/-through/-to scoping, priority/override semantics matching other exceptions, text and JSON report output, and write_sdc serialisation. Adapted from Silimate PR #57; uses upstream/master Mode/Scene and string_view APIs. Test uses unset_path_exceptions in place of the Silimate-only reset_path alias. Co-authored-by: Cursor <[email protected]> * Fix nested delaySum call indentation to match project style. Co-authored-by: Cursor <[email protected]> * Address review: store PathMargin on PathEnd, split tests Keep the path margin exception on PathEndClkConstrained, add PathEnd::hasPathMargin for report gating, and split the monolithic regression into set_path_margin1–6. Rebased onto upstream/master and document the command in ChangeLog. Co-authored-by: Cursor <[email protected]> * Document set_path_margin in OpenSTA.fodt/pdf Add the command reference, index entry, and note that unset_path_exceptions also clears path margin exceptions. Co-authored-by: Cursor <[email protected]> * Drop [[nodiscard]] from PathEnd::hasPathMargin. Co-authored-by: Cursor <[email protected]> --------- Co-authored-by: Cursor <[email protected]>
38 lines
1.4 KiB
Tcl
38 lines
1.4 KiB
Tcl
# set_path_margin -to with -setup/-hold
|
|
|
|
read_liberty ../examples/nangate45_typ.lib.gz
|
|
read_verilog ../examples/example1.v
|
|
link_design top
|
|
create_clock -name clk -period 10 {clk1 clk2 clk3}
|
|
set_input_delay -clock clk 0 {in1 in2}
|
|
|
|
proc setup_at { args } {
|
|
report_checks {*}$args -path_delay max -digits 4 -fields {} -group_path_count 1
|
|
}
|
|
proc hold_at { args } {
|
|
report_checks {*}$args -path_delay min -digits 4 -fields {} -group_path_count 1
|
|
}
|
|
proc report_json_path_margin { label path_delay args } {
|
|
set cmd [concat [list report_checks] $args \
|
|
[list -path_delay $path_delay -format json -group_path_count 1]]
|
|
with_output_to_variable json $cmd
|
|
if { [regexp {"path_margin": ([^,\n]+)} $json match margin] } {
|
|
puts "$label $margin"
|
|
} else {
|
|
puts "$label none"
|
|
}
|
|
}
|
|
|
|
set_path_margin -setup 0.50 -comment {tighten setup time} -to [get_pins r3/D]
|
|
setup_at -to [get_pins r3/D]
|
|
report_json_path_margin setup_to_tighten max -to [get_pins r3/D]
|
|
set_path_margin -hold 0.50 -comment {tighten hold time} -to [get_pins r3/D]
|
|
hold_at -to [get_pins r3/D]
|
|
report_json_path_margin hold_to_tighten min -to [get_pins r3/D]
|
|
set_path_margin -setup -67 -comment {loosen setup time} -to [get_pins r3/D]
|
|
setup_at -to [get_pins r3/D]
|
|
report_json_path_margin setup_to_loosen max -to [get_pins r3/D]
|
|
set_path_margin -hold -0.50 -comment {loosen hold time} -to [get_pins r3/D]
|
|
hold_at -to [get_pins r3/D]
|
|
report_json_path_margin hold_to_loosen min -to [get_pins r3/D]
|