@@ -185,4 +185,74 @@ TEST_F(TestReadVerilog, DeepDescendantModBTermCollision)
185185 EXPECT_EQ (txclk_modnet->getModBTerms ().size (), 1u );
186186}
187187
188+ TEST_F (TestReadVerilog, EscapedBracketScalarNames)
189+ {
190+ const testing::TestInfo* test_info
191+ = testing::UnitTest::GetInstance ()->current_test_info ();
192+ const std::string test_name
193+ = std::string (test_info->test_suite_name ()) + " _" + test_info->name ();
194+
195+ readVerilogAndSetup (test_name + " .v" , /* init_default_sdc=*/ false );
196+
197+ odb::dbBTerm* raw_bterm = block_->findBTerm (" foo[3]" );
198+ odb::dbBTerm* leading_escape_bterm = block_->findBTerm (" \\ foo[3]" );
199+ odb::dbBTerm* escaped_bterm = block_->findBTerm (" foo\\ [3\\ ]" );
200+ EXPECT_EQ (raw_bterm, nullptr );
201+ EXPECT_EQ (leading_escape_bterm, nullptr );
202+ ASSERT_NE (escaped_bterm, nullptr );
203+ EXPECT_STREQ (escaped_bterm->getConstName (), " foo\\ [3\\ ]" );
204+
205+ odb::dbModule* child = block_->findModule (" child" );
206+ ASSERT_NE (child, nullptr );
207+
208+ EXPECT_EQ (child->findModBTerm (" foo[3]" ), nullptr );
209+ EXPECT_EQ (child->findModBTerm (" \\ foo[3]" ), nullptr );
210+ odb::dbModBTerm* escaped_modbterm = child->findModBTerm (" foo\\ [3\\ ]" );
211+ ASSERT_NE (escaped_modbterm, nullptr );
212+
213+ EXPECT_EQ (child->getModNet (" foo[3]" ), nullptr );
214+ EXPECT_EQ (child->getModNet (" \\ foo[3]" ), nullptr );
215+ odb::dbModNet* escaped_modnet = child->getModNet (" foo\\ [3\\ ]" );
216+ ASSERT_NE (escaped_modnet, nullptr );
217+ EXPECT_EQ (escaped_modbterm->getModNet (), escaped_modnet);
218+ }
219+
220+ TEST_F (TestReadVerilog, BusBitAndEscapedScalarAreDistinct)
221+ {
222+ const testing::TestInfo* test_info
223+ = testing::UnitTest::GetInstance ()->current_test_info ();
224+ const std::string test_name
225+ = std::string (test_info->test_suite_name ()) + " _" + test_info->name ();
226+
227+ readVerilogAndSetup (test_name + " .v" , /* init_default_sdc=*/ false );
228+
229+ odb::dbBTerm* bus_bit_bterm = block_->findBTerm (" foo[3]" );
230+ odb::dbBTerm* leading_escape_bterm = block_->findBTerm (" \\ foo[3]" );
231+ odb::dbBTerm* escaped_bterm = block_->findBTerm (" foo\\ [3\\ ]" );
232+ ASSERT_NE (bus_bit_bterm, nullptr );
233+ EXPECT_EQ (leading_escape_bterm, nullptr );
234+ ASSERT_NE (escaped_bterm, nullptr );
235+ EXPECT_NE (bus_bit_bterm, escaped_bterm);
236+
237+ odb::dbModule* child = block_->findModule (" child" );
238+ ASSERT_NE (child, nullptr );
239+
240+ odb::dbModBTerm* bus_port = child->findModBTerm (" foo" );
241+ odb::dbModBTerm* bus_bit_port = child->findModBTerm (" foo[3]" );
242+ odb::dbModBTerm* escaped_port = child->findModBTerm (" foo\\ [3\\ ]" );
243+ ASSERT_NE (bus_port, nullptr );
244+ ASSERT_NE (bus_bit_port, nullptr );
245+ EXPECT_EQ (child->findModBTerm (" \\ foo[3]" ), nullptr );
246+ ASSERT_NE (escaped_port, nullptr );
247+ EXPECT_NE (bus_bit_port, escaped_port);
248+
249+ odb::dbModNet* bus_bit_modnet = child->getModNet (" foo[3]" );
250+ odb::dbModNet* escaped_modnet = child->getModNet (" foo\\ [3\\ ]" );
251+ ASSERT_NE (bus_bit_modnet, nullptr );
252+ EXPECT_EQ (child->getModNet (" \\ foo[3]" ), nullptr );
253+ ASSERT_NE (escaped_modnet, nullptr );
254+ EXPECT_NE (bus_bit_modnet, escaped_modnet);
255+ EXPECT_EQ (escaped_port->getModNet (), escaped_modnet);
256+ }
257+
188258} // namespace sta
0 commit comments