Skip to content

Commit 86460db

Browse files
authored
Merge pull request #80 from akashlevy/master
Allow boolean attributes to be used in `get_* -filter` expressions without comparison
2 parents 4669972 + 6245490 commit 86460db

File tree

5 files changed

+56
-40
lines changed

5 files changed

+56
-40
lines changed

doc/OpenSTA.odt

105 Bytes
Binary file not shown.

doc/OpenSTA.pdf

1.65 KB
Binary file not shown.

sdc/Sdc.tcl

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -408,25 +408,22 @@ proc current_design { {design ""} } {
408408

409409
# Generic get_* filter.
410410
proc filter_objs { filter objects filter_function object_type } {
411-
set filter_regexp1 {@?([a-zA-Z_]+) *(==|!=|=~|!~) *([0-9a-zA-Z_\*]+)}
411+
set filter_regexp1 {@?([a-zA-Z_]+) *((==|!=|=~|!~) *([0-9a-zA-Z_\*]+))?}
412412
set filter_or_regexp "($filter_regexp1) *\\|\\| *($filter_regexp1)"
413413
set filter_and_regexp "($filter_regexp1) *&& *($filter_regexp1)"
414414
set filtered_objects {}
415415
# Ignore sub-exprs in filter_regexp1 for expr2 match var.
416-
if { [regexp $filter_or_regexp $filter ignore expr1 \
417-
ignore ignore ignore expr2] } {
418-
regexp $filter_regexp1 $expr1 ignore attr_name op arg
419-
set filtered_objects1 [$filter_function $attr_name $op $arg $objects]
420-
regexp $filter_regexp1 $expr2 ignore attr_name op arg
421-
set filtered_objects2 [$filter_function $attr_name $op $arg $objects]
416+
if { [regexp $filter_or_regexp $filter ignore expr1 ignore ignore ignore ignore expr2] } {
417+
set filtered_objects1 [filter_objs $expr1 $objects $filter_function $object_type]
418+
set filtered_objects2 [filter_objs $expr2 $objects $filter_function $object_type]
422419
set filtered_objects [concat $filtered_objects1 $filtered_objects2]
423-
} elseif { [regexp $filter_and_regexp $filter ignore expr1 \
424-
ignore ignore ignore expr2] } {
425-
regexp $filter_regexp1 $expr1 ignore attr_name op arg
426-
set filtered_objects [$filter_function $attr_name $op $arg $objects]
427-
regexp $filter_regexp1 $expr2 ignore attr_name op arg
428-
set filtered_objects [$filter_function $attr_name $op $arg $filtered_objects]
429-
} elseif { [regexp $filter_regexp1 $filter ignore attr_name op arg] } {
420+
} elseif { [regexp $filter_and_regexp $filter ignore expr1 ignore ignore ignore ignore expr2] } {
421+
set filtered_objects [filter_objs $expr1 $objects $filter_function $object_type]
422+
set filtered_objects [filter_objs $expr2 $filtered_objects $filter_function $object_type]
423+
} elseif { [regexp $filter_regexp1 $filter ignore attr_name ignore op arg] } {
424+
# If no op/arg, use <attr_name>==1 by default.
425+
set op [expr {($op == "") ? "==" : $op}]
426+
set arg [expr {($arg == "") ? "1" : $arg}]
430427
set filtered_objects [$filter_function $attr_name $op $arg $objects]
431428
} else {
432429
sta_error 350 "unsupported $object_type -filter expression."

test/get_filter.ok

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,34 @@
1-
get_cells
1+
[get_cells -filter liberty_cell==BUFx2_ASAP7_75t_R *]
22
u1
3-
get_clocks
3+
[get_clocks -filter is_virtual==0 *]
44
clk
5-
get_clocks 2
5+
[get_clocks -filter is_virtual==1 *]
66
vclk
7-
get_lib_cells
7+
[get_clocks -filter is_virtual *]
8+
vclk
9+
[get_clocks -filter is_virtual&&is_generated *]
10+
[get_clocks -filter is_virtual&&is_generated==0 *]
11+
vclk
12+
[get_clocks -filter is_virtual||is_generated *]
13+
vclk
14+
[get_clocks -filter is_virtual==0||is_generated *]
15+
clk
16+
[get_lib_cells -filter is_buffer==1 *]
817
asap7_small/BUFx2_ASAP7_75t_R
9-
get_lib_cells 2
18+
[get_lib_cells -filter is_inverter==0 *]
1019
asap7_small/AND2x2_ASAP7_75t_R
1120
asap7_small/BUFx2_ASAP7_75t_R
1221
asap7_small/DFFHQx4_ASAP7_75t_R
13-
get_lib_pins
22+
[get_lib_pins -filter direction==input BUFx2_ASAP7_75t_R/*]
1423
A
15-
get_lib_pins 2
24+
[get_lib_pins -filter direction==output BUFx2_ASAP7_75t_R/*]
1625
Y
17-
get_libs
26+
[get_libs -filter name==asap7_small *]
1827
asap7_small
19-
get_nets
28+
[get_nets -filter name=~*q *]
2029
r1q
2130
r2q
22-
get_pins
31+
[get_pins -filter direction==input *]
2332
r1/CLK
2433
r1/D
2534
r2/CLK
@@ -29,17 +38,17 @@ r3/D
2938
u1/A
3039
u2/A
3140
u2/B
32-
get_pins 2
41+
[get_pins -filter direction==output *]
3342
r1/Q
3443
r2/Q
3544
r3/Q
3645
u1/Y
3746
u2/Y
38-
get_ports
47+
[get_ports -filter direction==input *]
3948
clk1
4049
clk2
4150
clk3
4251
in1
4352
in2
44-
get_ports 2
53+
[get_ports -filter direction==output *]
4554
out

test/get_filter.tcl

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,39 @@ create_clock -name clk -period 500 {clk1 clk2 clk3}
66
create_clock -name vclk -period 1000
77

88
# Test filters for each SDC command
9-
puts "get_cells"
9+
puts {[get_cells -filter liberty_cell==BUFx2_ASAP7_75t_R *]}
1010
report_object_full_names [get_cells -filter liberty_cell==BUFx2_ASAP7_75t_R *]
11-
puts "get_clocks"
11+
puts {[get_clocks -filter is_virtual==0 *]}
1212
report_object_full_names [get_clocks -filter is_virtual==0 *]
13-
puts "get_clocks 2"
13+
puts {[get_clocks -filter is_virtual==1 *]}
1414
report_object_full_names [get_clocks -filter is_virtual==1 *]
15-
puts "get_lib_cells"
15+
puts {[get_clocks -filter is_virtual *]}
16+
report_object_full_names [get_clocks -filter is_virtual *]
17+
puts {[get_clocks -filter is_virtual&&is_generated *]}
18+
report_object_full_names [get_clocks -filter is_virtual&&is_generated *]
19+
puts {[get_clocks -filter is_virtual&&is_generated==0 *]}
20+
report_object_full_names [get_clocks -filter is_virtual&&is_generated==0 *]
21+
puts {[get_clocks -filter is_virtual||is_generated *]}
22+
report_object_full_names [get_clocks -filter is_virtual||is_generated *]
23+
puts {[get_clocks -filter is_virtual==0||is_generated *]}
24+
report_object_full_names [get_clocks -filter is_virtual==0||is_generated *]
25+
puts {[get_lib_cells -filter is_buffer==1 *]}
1626
report_object_full_names [get_lib_cells -filter is_buffer==1 *]
17-
puts "get_lib_cells 2"
27+
puts {[get_lib_cells -filter is_inverter==0 *]}
1828
report_object_full_names [get_lib_cells -filter is_inverter==0 *]
19-
puts "get_lib_pins"
29+
puts {[get_lib_pins -filter direction==input BUFx2_ASAP7_75t_R/*]}
2030
report_object_full_names [get_lib_pins -filter direction==input BUFx2_ASAP7_75t_R/*]
21-
puts "get_lib_pins 2"
31+
puts {[get_lib_pins -filter direction==output BUFx2_ASAP7_75t_R/*]}
2232
report_object_full_names [get_lib_pins -filter direction==output BUFx2_ASAP7_75t_R/*]
23-
puts "get_libs"
33+
puts {[get_libs -filter name==asap7_small *]}
2434
report_object_full_names [get_libs -filter name==asap7_small *]
25-
puts "get_nets"
35+
puts {[get_nets -filter name=~*q *]}
2636
report_object_full_names [get_nets -filter name=~*q *]
27-
puts "get_pins"
37+
puts {[get_pins -filter direction==input *]}
2838
report_object_full_names [get_pins -filter direction==input *]
29-
puts "get_pins 2"
39+
puts {[get_pins -filter direction==output *]}
3040
report_object_full_names [get_pins -filter direction==output *]
31-
puts "get_ports"
41+
puts {[get_ports -filter direction==input *]}
3242
report_object_full_names [get_ports -filter direction==input *]
33-
puts "get_ports 2"
43+
puts {[get_ports -filter direction==output *]}
3444
report_object_full_names [get_ports -filter direction==output *]

0 commit comments

Comments
 (0)