Skip to content

Commit c2acfef

Browse files
author
Naveen Venkat
committed
odb: ignore supply pins when validating buffers
LEF power and ground pins may legally use INPUT direction. Exclude supply MTerms when identifying a buffer signal input and output so those cells remain usable for repair operations. Signed-off-by: Naveen Venkat <archgen.guest@nyayanidhi.in>
1 parent c88e270 commit c2acfef

2 files changed

Lines changed: 45 additions & 0 deletions

File tree

src/odb/src/db/dbInsertBuffer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,9 @@ dbInst* dbInsertBuffer::checkAndCreateBuffer()
277277
dbMTerm* input_mterm = nullptr;
278278
dbMTerm* output_mterm = nullptr;
279279
for (dbMTerm* mterm : const_cast<dbMaster*>(buffer_master_)->getMTerms()) {
280+
if (mterm->getSigType().isSupply()) {
281+
continue;
282+
}
280283
if (mterm->getIoType() == dbIoType::INPUT) {
281284
if (input_mterm != nullptr) {
282285
logger_->warn(utl::ODB,

src/odb/test/cpp/TestDbNet.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,48 @@ TEST_F(TestDbNet, FindRelatedModNetsClearsSet)
216216
EXPECT_TRUE(related_modnets.empty());
217217
}
218218

219+
TEST_F(TestDbNet, InsertBufferIgnoresSupplyInputs)
220+
{
221+
dbMaster* inv_master = db_->findMaster("INV_X1");
222+
ASSERT_NE(inv_master, nullptr);
223+
224+
dbMaster* buffer_master
225+
= dbMaster::create(inv_master->getLib(), "BUF_WITH_INPUT_SUPPLIES");
226+
buffer_master->setWidth(inv_master->getWidth());
227+
buffer_master->setHeight(inv_master->getHeight());
228+
buffer_master->setType(dbMasterType::CORE);
229+
dbMTerm* buffer_input
230+
= dbMTerm::create(buffer_master, "A", dbIoType::INPUT, dbSigType::SIGNAL);
231+
dbMTerm* buffer_output = dbMTerm::create(
232+
buffer_master, "Z", dbIoType::OUTPUT, dbSigType::SIGNAL);
233+
dbMTerm::create(buffer_master, "VDD", dbIoType::INPUT, dbSigType::POWER);
234+
dbMTerm::create(buffer_master, "VSS", dbIoType::INPUT, dbSigType::GROUND);
235+
buffer_master->setFrozen();
236+
237+
dbInst* driver = dbInst::create(block_, inv_master, "driver");
238+
dbInst* load = dbInst::create(block_, inv_master, "load");
239+
dbITerm* driver_output = driver->findITerm("ZN");
240+
dbITerm* load_input = load->findITerm("A");
241+
ASSERT_NE(driver_output, nullptr);
242+
ASSERT_NE(load_input, nullptr);
243+
244+
dbNet* net = dbNet::create(block_, "signal");
245+
driver_output->connect(net);
246+
load_input->connect(net);
247+
248+
dbInst* buffer
249+
= net->insertBufferBeforeLoad(load_input, buffer_master, nullptr, "buf");
250+
251+
ASSERT_NE(buffer, nullptr);
252+
EXPECT_EQ(buffer->getITerm(buffer_input)->getNet(), net);
253+
dbNet* buffered_net = buffer->getITerm(buffer_output)->getNet();
254+
ASSERT_NE(buffered_net, nullptr);
255+
EXPECT_NE(buffered_net, net);
256+
EXPECT_EQ(load_input->getNet(), buffered_net);
257+
EXPECT_EQ(buffer->findITerm("VDD")->getNet(), nullptr);
258+
EXPECT_EQ(buffer->findITerm("VSS")->getNet(), nullptr);
259+
}
260+
219261
// Test that the net is renamed to the name of the highest-level modnet
220262
TEST_F(TestDbNet, RenameWithModNetInHighestHier)
221263
{

0 commit comments

Comments
 (0)