@@ -3371,4 +3371,103 @@ TEST_F(TestInsertBuffer, BeforeLoads_Case34)
33713371 writeAndCompareVerilogOutputFile (test_name, test_name + " _post.v" );
33723372}
33733373
3374+ TEST_F (TestInsertBuffer, BusBitModNetName)
3375+ {
3376+ const auto * test_info = testing::UnitTest::GetInstance ()->current_test_info ();
3377+ const std::string test_name
3378+ = std::string (test_info->test_suite_name ()) + " _" + test_info->name ();
3379+
3380+ int num_warning = 0 ;
3381+ readVerilogAndSetup (test_name + " _pre.v" );
3382+
3383+ dbMaster* buf_master = db_->findMaster (" BUF_X4" );
3384+ ASSERT_NE (buf_master, nullptr );
3385+
3386+ dbModule* sub_mod = block_->findModule (" SUB" );
3387+ ASSERT_NE (sub_mod, nullptr );
3388+
3389+ EXPECT_NE (block_->findBTerm (" foo[3]" ), nullptr );
3390+ EXPECT_EQ (block_->findBTerm (" \\ foo[3]" ), nullptr );
3391+ EXPECT_NE (sub_mod->findModBTerm (" foo[3]" ), nullptr );
3392+ EXPECT_EQ (sub_mod->findModBTerm (" foo\\ [3\\ ]" ), nullptr );
3393+ EXPECT_EQ (sub_mod->getModNet (" foo[3]1" ), nullptr );
3394+ EXPECT_EQ (sub_mod->getModNet (" foo\\ [3\\ ]" ), nullptr );
3395+
3396+ dbNet* flat_net = block_->findNet (" foo[3]" );
3397+ ASSERT_NE (flat_net, nullptr );
3398+ dbITerm* load0_a = block_->findITerm (" sub0/load0/A" );
3399+ ASSERT_NE (load0_a, nullptr );
3400+ ASSERT_EQ (load0_a->getNet (), flat_net);
3401+ dbITerm* load1_a = block_->findITerm (" sub0/child0/load1/A" );
3402+ ASSERT_NE (load1_a, nullptr );
3403+ ASSERT_EQ (load1_a->getNet (), flat_net);
3404+
3405+ odb::PtrSet<dbObject> load_pins;
3406+ load_pins.insert (load0_a);
3407+ load_pins.insert (load1_a);
3408+
3409+ dbInst* new_buf
3410+ = flat_net->insertBufferBeforeLoads (load_pins,
3411+ buf_master,
3412+ nullptr ,
3413+ " split" ,
3414+ " foo[3]" ,
3415+ dbNameUniquifyType::IF_NEEDED ,
3416+ false );
3417+ ASSERT_NE (new_buf, nullptr );
3418+
3419+ sta_->updateTiming (true );
3420+ num_warning = db_network_->checkAxioms ();
3421+ num_warning += sta_->checkSanity ();
3422+ EXPECT_EQ (num_warning, 0 );
3423+
3424+ std::string mod_net_names;
3425+ for (dbModNet* mod_net : sub_mod->getModNets ()) {
3426+ if (!mod_net_names.empty ()) {
3427+ mod_net_names += " , " ;
3428+ }
3429+ mod_net_names += mod_net->getConstName ();
3430+ }
3431+
3432+ EXPECT_NE (sub_mod->getModNet (" foo_3_" ), nullptr )
3433+ << " The split net is a scalar wire, so bracket characters should be "
3434+ " replaced in the stored dbModNet name. Existing dbModNet names: "
3435+ << mod_net_names;
3436+
3437+ writeAndCompareVerilogOutputFile (test_name, test_name + " _post.v" );
3438+ }
3439+
3440+ TEST_F (TestInsertBuffer, BusBitBTermName)
3441+ {
3442+ dbMaster* buf_master = db_->findMaster (" BUF_X4" );
3443+ ASSERT_NE (buf_master, nullptr );
3444+
3445+ dbNet* orig_net = dbNet::create (block_, " orig" );
3446+ ASSERT_NE (orig_net, nullptr );
3447+ dbBTerm* bterm = dbBTerm::create (orig_net, " foo[3]" );
3448+ ASSERT_NE (bterm, nullptr );
3449+ bterm->setIoType (dbIoType::OUTPUT );
3450+ bterm->connect (orig_net);
3451+
3452+ dbInst* drvr = dbInst::create (block_, db_->findMaster (" LOGIC0_X1" ), " drvr" );
3453+ ASSERT_NE (drvr, nullptr );
3454+ dbITerm* drvr_z = drvr->findITerm (" Z" );
3455+ ASSERT_NE (drvr_z, nullptr );
3456+ drvr_z->connect (orig_net);
3457+
3458+ dbInst* new_buf
3459+ = orig_net->insertBufferBeforeLoad (bterm, buf_master, nullptr , " output" );
3460+ ASSERT_NE (new_buf, nullptr );
3461+
3462+ dbITerm* buf_z = new_buf->findITerm (" Z" );
3463+ ASSERT_NE (buf_z, nullptr );
3464+ dbNet* buf_out_net = buf_z->getNet ();
3465+ ASSERT_NE (buf_out_net, nullptr );
3466+
3467+ EXPECT_EQ (bterm->getNet (), buf_out_net);
3468+ EXPECT_STREQ (buf_out_net->getConstName (), " foo[3]" )
3469+ << " BTerm-derived net names must preserve the port name for Verilog "
3470+ " compatibility." ;
3471+ }
3472+
33743473} // namespace odb
0 commit comments