From b484abc62273390962b34a90c0c42fe9f631e8e4 Mon Sep 17 00:00:00 2001 From: Akash Levy Date: Sun, 11 Aug 2024 22:02:05 -0700 Subject: [PATCH] First cut of -filter for all SDC objects --- sdc/Sdc.tcl | 156 +++++++++++++++++++--------------------------------- 1 file changed, 58 insertions(+), 98 deletions(-) diff --git a/sdc/Sdc.tcl b/sdc/Sdc.tcl index eb52c098..f32fe2da 100644 --- a/sdc/Sdc.tcl +++ b/sdc/Sdc.tcl @@ -406,6 +406,36 @@ proc current_design { {design ""} } { ################################################################ +# Generic filter_objs command. +proc filter_objs { filter objects filter_function filter_type error_code } { + set filter_regexp1 {@?([a-zA-Z_]+) *(==|!=|=~|!~) *([0-9a-zA-Z_\*]+)} + set filter_or_regexp "($filter_regexp1) *\\|\\| *($filter_regexp1)" + set filter_and_regexp "($filter_regexp1) *&& *($filter_regexp1)" + set filtered_objects {} + # Ignore sub-exprs in filter_regexp1 for expr2 match var. + if { [regexp $filter_or_regexp $filter ignore expr1 \ + ignore ignore ignore expr2] } { + regexp $filter_regexp1 $expr1 ignore attr_name op arg + set filtered_objects1 [$filter_function $attr_name $op $arg $objects] + regexp $filter_regexp1 $expr2 ignore attr_name op arg + set filtered_objects2 [$filter_function $attr_name $op $arg $objects] + set filtered_objects [concat $filtered_objects1 $filtered_objects2] + } elseif { [regexp $filter_and_regexp $filter ignore expr1 \ + ignore ignore ignore expr2] } { + regexp $filter_regexp1 $expr1 ignore attr_name op arg + set filtered_objects [$filter_function $attr_name $op $arg $objects] + regexp $filter_regexp1 $expr2 ignore attr_name op arg + set filtered_objects [$filter_function $attr_name $op $arg $filtered_objects] + } elseif { [regexp $filter_regexp1 $filter ignore attr_name op arg] } { + set filtered_objects [$filter_function $attr_name $op $arg $objects] + } else { + sta_error $error_code "unsupported $filter_type -filter expression." + } + return $filtered_objects +} + +################################################################ + define_cmd_args "get_cells" \ {[-hierarchical] [-hsc separator] [-filter expr]\ [-regexp] [-nocase] [-quiet] [-of_objects objects] [patterns]} @@ -473,46 +503,19 @@ proc get_cells { args } { } } if [info exists keys(-filter)] { - set insts [filter_insts1 $keys(-filter) $insts] + set insts [filter_objs $keys(-filter) $insts filter_insts "instance" 350] } return $insts } -proc filter_insts1 { filter objects } { - variable filter_regexp1 - variable filter_or_regexp - variable filter_and_regexp - set filtered_objects {} - # Ignore sub-exprs in filter_regexp1 for expr2 match var. - if { [regexp $filter_or_regexp $filter ignore expr1 \ - ignore ignore ignore expr2] } { - regexp $filter_regexp1 $expr1 ignore attr_name op arg - set filtered_objects1 [filter_insts $attr_name $op $arg $objects] - regexp $filter_regexp1 $expr2 ignore attr_name op arg - set filtered_objects2 [filter_insts $attr_name $op $arg $objects] - set filtered_objects [concat $filtered_objects1 $filtered_objects2] - } elseif { [regexp $filter_and_regexp $filter ignore expr1 \ - ignore ignore ignore expr2] } { - regexp $filter_regexp1 $expr1 ignore attr_name op arg - set filtered_objects [filter_insts $attr_name $op $arg $objects] - regexp $filter_regexp1 $expr2 ignore attr_name op arg - set filtered_objects [filter_insts $attr_name $op $arg $filtered_objects] - } elseif { [regexp $filter_regexp1 $filter ignore attr_name op arg] } { - set filtered_objects [filter_insts $attr_name $op $arg $objects] - } else { - sta_error 350 "unsupported instance -filter expression." - } - return $filtered_objects -} - ################################################################ -define_cmd_args "get_clocks" {[-regexp] [-nocase] [-quiet] patterns} +define_cmd_args "get_clocks" {[-regexp] [-nocase] [-quiet] [-filter expr] patterns} define_cmd_alias "get_clock" "get_clocks" proc get_clocks { args } { - parse_key_args "get_clocks" args keys {} flags {-regexp -nocase -quiet} + parse_key_args "get_clocks" args keys {-filter} flags {-regexp -nocase -quiet} check_argc_eq1 "get_clocks" $args check_nocase_flag flags @@ -531,20 +534,23 @@ proc get_clocks { args } { } } } + if [info exists keys(-filter)] { + set clocks [filter_objs $keys(-filter) $clocks filter_clocks "clock" 2351] + } return $clocks } ################################################################ define_cmd_args "get_lib_cells" \ - {[-hsc separator] [-regexp] [-nocase] [-quiet]\ + {[-hsc separator] [-regexp] [-nocase] [-quiet] [-filter expr]\ [-of_objects objects] [patterns]} define_cmd_alias "get_lib_cell" "get_lib_cells" proc get_lib_cells { args } { global hierarchy_separator - parse_key_args "get_lib_cells" args keys {-hsc -of_objects} \ + parse_key_args "get_lib_cells" args keys {-hsc -of_objects -filter} \ flags {-regexp -nocase -quiet} check_nocase_flag flags @@ -598,20 +604,23 @@ proc get_lib_cells { args } { } } } + if [info exists keys(-filter)] { + set cells [filter_objs $keys(-filter) $cells filter_lib_cells "liberty cells" 2354] + } return $cells } ################################################################ define_cmd_args "get_lib_pins" \ - {[-hsc separator] [-regexp] [-nocase] [-quiet] patterns} + {[-hsc separator] [-regexp] [-nocase] [-quiet] [-filter expr] patterns} define_cmd_alias "get_lib_pin" "get_lib_pins" # "get_lib_ports" in sta terminology. proc get_lib_pins { args } { global hierarchy_separator - parse_key_args "get_lib_pins" args keys {-hsc} flags {-regexp -nocase -quiet} + parse_key_args "get_lib_pins" args keys {-hsc -filter} flags {-regexp -nocase -quiet} check_argc_eq1 "get_lib_pins" $args check_nocase_flag flags @@ -668,6 +677,9 @@ proc get_lib_pins { args } { } } } + if [info exists keys(-filter)] { + set ports [filter_objs $keys(-filter) $ports filter_lib_pins "liberty port" 2357] + } return $ports } @@ -680,12 +692,12 @@ proc check_nocase_flag { flags_var } { ################################################################ -define_cmd_args "get_libs" {[-regexp] [-nocase] [-quiet] patterns} +define_cmd_args "get_libs" {[-regexp] [-nocase] [-quiet] [-filter expr] patterns} define_cmd_alias "get_lib" "get_libs" proc get_libs { args } { - parse_key_args "get_libs" args keys {} flags {-regexp -nocase -quiet} + parse_key_args "get_libs" args keys {-filter} flags {-regexp -nocase -quiet} check_argc_eq1 "get_libs" $args check_nocase_flag flags @@ -704,6 +716,9 @@ proc get_libs { args } { } } } + if [info exists keys(-filter)] { + set libs [filter_objs $keys(-filter) $libs filter_liberty_libraries "liberty library" 2351] + } return $libs } @@ -737,7 +752,7 @@ proc find_liberty_libraries_matching { pattern regexp nocase } { ################################################################ define_cmd_args "get_nets" \ - {[-hierarchical] [-hsc separator] [-regexp] [-nocase] [-quiet]\ + {[-hierarchical] [-hsc separator] [-regexp] [-nocase] [-quiet] [-filter expr]\ [-of_objects objects] [patterns]} define_cmd_alias "get_net" "get_nets" @@ -745,7 +760,7 @@ define_cmd_alias "get_net" "get_nets" proc get_nets { args } { global hierarchy_separator - parse_key_args get_nets args keys {-hsc -of_objects} \ + parse_key_args get_nets args keys {-hsc -of_objects -filter} \ flags {-hierarchical -regexp -nocase -quiet} check_nocase_flag flags @@ -791,6 +806,9 @@ proc get_nets { args } { } } } + if [info exists keys(-filter)] { + set nets [filter_objs $keys(-filter) $nets filter_nets "net" 2361] + } return $nets } @@ -858,38 +876,11 @@ proc get_pins { args } { } } if [info exists keys(-filter)] { - set pins [filter_pins1 $keys(-filter) $pins] + set pins [filter_objs $keys(-filter) $pins filter_pins "pin" 2363] } return $pins } -proc filter_pins1 { filter objects } { - variable filter_regexp1 - variable filter_or_regexp - variable filter_and_regexp - set filtered_objects {} - # Ignore sub-exprs in filter_regexp1 for expr2 match var. - if { [regexp $filter_or_regexp $filter ignore expr1 \ - ignore ignore ignore expr2] } { - regexp $filter_regexp1 $expr1 ignore attr_name op arg - set filtered_objects1 [filter_pins $attr_name $op $arg $objects] - regexp $filter_regexp1 $expr2 ignore attr_name op arg - set filtered_objects2 [filter_pins $attr_name $op $arg $objects] - set filtered_objects [concat $filtered_objects1 $filtered_objects2] - } elseif { [regexp $filter_and_regexp $filter ignore expr1 \ - ignore ignore ignore expr2] } { - regexp $filter_regexp1 $expr1 ignore attr_name op arg - set filtered_objects [filter_pins $attr_name $op $arg $objects] - regexp $filter_regexp1 $expr2 ignore attr_name op arg - set filtered_objects [filter_pins $attr_name $op $arg $filtered_objects] - } elseif { [regexp $filter_regexp1 $filter ignore attr_name op arg] } { - set filtered_objects [filter_pins $attr_name $op $arg $objects] - } else { - sta_error 364 "unsupported pin -filter expression." - } - return $filtered_objects -} - ################################################################ define_cmd_args "get_ports" \ @@ -930,42 +921,11 @@ proc get_ports { args } { } } if [info exists keys(-filter)] { - set ports [filter_ports1 $keys(-filter) $ports] + set ports [filter_objs $keys(-filter) $portss filter_ports "port" 2366] } return $ports } -variable filter_regexp1 {@?([a-zA-Z_]+) *(==|!=|=~|!~) *([0-9a-zA-Z_\*]+)} -variable filter_or_regexp "($filter_regexp1) *\\|\\| *($filter_regexp1)" -variable filter_and_regexp "($filter_regexp1) *&& *($filter_regexp1)" - -proc filter_ports1 { filter objects } { - variable filter_regexp1 - variable filter_or_regexp - variable filter_and_regexp - set filtered_objects {} - # Ignore sub-exprs in filter_regexp1 for expr2 match var. - if { [regexp $filter_or_regexp $filter ignore expr1 \ - ignore ignore ignore expr2] } { - regexp $filter_regexp1 $expr1 ignore attr_name op arg - set filtered_objects1 [filter_ports $attr_name $op $arg $objects] - regexp $filter_regexp1 $expr2 ignore attr_name op arg - set filtered_objects2 [filter_ports $attr_name $op $arg $objects] - set filtered_objects [concat $filtered_objects1 $filtered_objects2] - } elseif { [regexp $filter_and_regexp $filter ignore expr1 \ - ignore ignore ignore expr2] } { - regexp $filter_regexp1 $expr1 ignore attr_name op arg - set filtered_objects [filter_ports $attr_name $op $arg $objects] - regexp $filter_regexp1 $expr2 ignore attr_name op arg - set filtered_objects [filter_ports $attr_name $op $arg $filtered_objects] - } elseif { [regexp $filter_regexp1 $filter ignore attr_name op arg] } { - set filtered_objects [filter_ports $attr_name $op $arg $objects] - } else { - sta_error 367 "unsupported port -filter expression." - } - return $filtered_objects -} - ################################################################ # # Timing Constraints