From e288db022554840b796fe2917fd4ec0963c38013 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Sat, 4 Apr 2026 06:36:12 +0000 Subject: [PATCH] In FilterExpr::lex allow '.' in key = value filter The current lexer doesn't allow the . in the filter name =~ tcdm_master_.*req_.*_i Signed-off-by: Matt Liberty --- sdc/FilterObjects.cc | 2 +- sdc/test/CMakeLists.txt | 1 + sdc/test/sdc_filter_dot.ok | 2 ++ sdc/test/sdc_filter_dot.tcl | 15 +++++++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 sdc/test/sdc_filter_dot.ok create mode 100644 sdc/test/sdc_filter_dot.tcl diff --git a/sdc/FilterObjects.cc b/sdc/FilterObjects.cc index 2e18473e..b7d47671 100644 --- a/sdc/FilterObjects.cc +++ b/sdc/FilterObjects.cc @@ -119,7 +119,7 @@ FilterExpr::lex(bool bool_props_as_int) {std::regex("^\\s+"), Token::Kind::skip}, {std::regex("^defined\\(([a-zA-Z_]+)\\)"), Token::Kind::defined}, {std::regex("^undefined\\(([a-zA-Z_]+)\\)"), Token::Kind::undefined}, - {std::regex("^@?([a-zA-Z_]+) *((==|!=|=~|!~) *([0-9a-zA-Z_\\/$\\[\\]*?]+))?"), Token::Kind::predicate}, + {std::regex("^@?([a-zA-Z_]+) *((==|!=|=~|!~) *([0-9a-zA-Z_\\/$\\[\\]*?.]+))?"), Token::Kind::predicate}, {std::regex("^(&&)"), Token::Kind::op_and}, {std::regex("^(\\|\\|)"), Token::Kind::op_or}, {std::regex("^(!)"), Token::Kind::op_inv}, diff --git a/sdc/test/CMakeLists.txt b/sdc/test/CMakeLists.txt index b714718f..7d32e1df 100644 --- a/sdc/test/CMakeLists.txt +++ b/sdc/test/CMakeLists.txt @@ -25,6 +25,7 @@ sta_module_tests("sdc" exception_thru_net exception_thru_override exceptions + filter_dot filter_query genclk_advanced leaf_pin_filter_removal diff --git a/sdc/test/sdc_filter_dot.ok b/sdc/test/sdc_filter_dot.ok new file mode 100644 index 00000000..6202b6e3 --- /dev/null +++ b/sdc/test/sdc_filter_dot.ok @@ -0,0 +1,2 @@ +[get_cells -filter {name =~ r.*} *] +{name =~ tcdm_master_.*req_.*_i} diff --git a/sdc/test/sdc_filter_dot.tcl b/sdc/test/sdc_filter_dot.tcl new file mode 100644 index 00000000..bf75fe86 --- /dev/null +++ b/sdc/test/sdc_filter_dot.tcl @@ -0,0 +1,15 @@ +# Test that '.' is allowed in filter predicate values. +# Targets: FilterExpr::lex (FilterObjects.cc) +source ../../test/helpers.tcl + +read_liberty ../../test/asap7_small.lib.gz +read_verilog ../../test/reg1_asap7.v +link_design top +create_clock -name clk -period 500 {clk1 clk2 clk3} + +# Filter with dot in glob pattern value (no cells have literal '.' so no match) +puts {[get_cells -filter {name =~ r.*} *]} +report_object_full_names [get_cells -filter {name =~ r.*} *] + +# Verify filter_expr_to_postfix parses dot-containing values +puts [sta::filter_expr_to_postfix "name =~ tcdm_master_.*req_.*_i" 0]