Skip to content

Commit 26d1073

Browse files
committed
odb: attempt to use net if port is not provided
Signed-off-by: Peter Gadfort <[email protected]>
1 parent a058e24 commit 26d1073

File tree

5 files changed

+183
-0
lines changed

5 files changed

+183
-0
lines changed

src/odb/src/3dblox/3dblox.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,30 @@ std::pair<dbInst*, odb::dbBTerm*> ThreeDBlox::createBump(
707707
net = term->getNet();
708708
}
709709

710+
// Find term via net
711+
if (term == nullptr && entry.net_name != "-") {
712+
net = block->findNet(entry.net_name.c_str());
713+
if (net == nullptr) {
714+
logger_->error(utl::ODB,
715+
543,
716+
"3DBV Parser Error: Bump net {} not found",
717+
entry.net_name);
718+
}
719+
if (net->getBTerms().empty()) {
720+
logger_->error(utl::ODB,
721+
544,
722+
"3DBV Parser Error: Bump net {} has no bterms",
723+
entry.net_name);
724+
}
725+
if (net->getBTerms().size() > 1) {
726+
logger_->error(utl::ODB,
727+
542,
728+
"3DBV Parser Error: Bump net {} has multiple bterms",
729+
entry.net_name);
730+
}
731+
term = net->get1stBTerm();
732+
}
733+
710734
if (net != nullptr) {
711735
for (odb::dbITerm* iterm : inst->getITerms()) {
712736
iterm->connect(net);

src/odb/test/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,8 @@ filegroup(
283283
"data/example.3dbx",
284284
"data/example.bmap",
285285
"data/example1.bmap",
286+
"data/example2.bmap",
287+
"data/example3.bmap",
286288
"data/floorplan_initialize.def",
287289
"data/floorplan_initialize.v",
288290
"data/floorplan_initialize2.def",

src/odb/test/cpp/Test3DBloxParser.cpp

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,5 +201,156 @@ TEST_F(SimpleDbFixture, test_bump_map_reader)
201201
EXPECT_EQ(sig2_box->getBox().yMax(), 202000);
202202
}
203203

204+
TEST_F(SimpleDbFixture, test_bump_map_reader_netsonly)
205+
{
206+
createSimpleDB();
207+
208+
db_->setDbuPerMicron(1000);
209+
210+
// Create BUMP master
211+
dbLib* lib = db_->findLib("lib1");
212+
dbTechLayer* bot_layer
213+
= dbTechLayer::create(lib->getTech(), "BOT", dbTechLayerType::ROUTING);
214+
dbTechLayer* layer
215+
= dbTechLayer::create(lib->getTech(), "TOP", dbTechLayerType::ROUTING);
216+
dbMaster* master = dbMaster::create(lib, "BUMP");
217+
master->setWidth(10000);
218+
master->setHeight(10000);
219+
master->setOrigin(5000, 5000);
220+
master->setType(dbMasterType::COVER_BUMP);
221+
dbMTerm* term
222+
= dbMTerm::create(master, "PAD", dbIoType::INOUT, dbSigType::SIGNAL);
223+
dbMPin* bot_pin = dbMPin::create(term);
224+
dbBox::create(bot_pin, bot_layer, -1000, -1000, 1000, 1000);
225+
dbMPin* pin = dbMPin::create(term);
226+
dbBox::create(pin, layer, -2000, -2000, 2000, 2000);
227+
master->setFrozen();
228+
229+
// Create BTerms
230+
dbBlock* block = db_->getChip()->getBlock();
231+
dbBTerm* SIG1 = dbBTerm::create(dbNet::create(block, "SIG1"), "SIG1");
232+
dbBTerm* SIG2 = dbBTerm::create(dbNet::create(block, "SIG2"), "SIG2");
233+
block->setDieArea(Rect(0, 0, 500, 500));
234+
235+
EXPECT_EQ(block->getInsts().size(), 0);
236+
237+
ThreeDBlox parser(&logger_, db_.get());
238+
std::string path = getFilePath(prefix + "data/example2.bmap");
239+
parser.readBMap(path);
240+
241+
// Check bumps were created
242+
EXPECT_EQ(block->getInsts().size(), 2);
243+
dbInst* inst1 = block->findInst("bump1");
244+
EXPECT_EQ(inst1->getBBox()->getBox().xCenter(), 100 * 1000);
245+
EXPECT_EQ(inst1->getBBox()->getBox().yCenter(), 200 * 1000);
246+
dbInst* inst2 = block->findInst("bump2");
247+
EXPECT_EQ(inst2->getBBox()->getBox().xCenter(), 150 * 1000);
248+
EXPECT_EQ(inst2->getBBox()->getBox().yCenter(), 200 * 1000);
249+
250+
// Check that BPins where added
251+
EXPECT_EQ(SIG1->getBPins().size(), 1);
252+
EXPECT_EQ(SIG2->getBPins().size(), 1);
253+
EXPECT_EQ(SIG1->getBPins().begin()->getBoxes().size(), 1);
254+
EXPECT_EQ(SIG2->getBPins().begin()->getBoxes().size(), 1);
255+
256+
// Check bPin shape and layer
257+
dbBox* sig1_box = *SIG1->getBPins().begin()->getBoxes().begin();
258+
dbBox* sig2_box = *SIG2->getBPins().begin()->getBoxes().begin();
259+
EXPECT_EQ(sig1_box->getTechLayer(), layer);
260+
EXPECT_EQ(sig1_box->getBox().xMin(), 98000);
261+
EXPECT_EQ(sig1_box->getBox().yMin(), 198000);
262+
EXPECT_EQ(sig1_box->getBox().xMax(), 102000);
263+
EXPECT_EQ(sig1_box->getBox().yMax(), 202000);
264+
EXPECT_EQ(sig2_box->getTechLayer(), layer);
265+
EXPECT_EQ(sig2_box->getBox().xMin(), 148000);
266+
EXPECT_EQ(sig2_box->getBox().yMin(), 198000);
267+
EXPECT_EQ(sig2_box->getBox().xMax(), 152000);
268+
EXPECT_EQ(sig2_box->getBox().yMax(), 202000);
269+
}
270+
271+
TEST_F(SimpleDbFixture, test_bump_map_reader_multiple_bterms)
272+
{
273+
createSimpleDB();
274+
275+
db_->setDbuPerMicron(1000);
276+
277+
// Create BUMP master
278+
dbLib* lib = db_->findLib("lib1");
279+
dbTechLayer* bot_layer
280+
= dbTechLayer::create(lib->getTech(), "BOT", dbTechLayerType::ROUTING);
281+
dbTechLayer* layer
282+
= dbTechLayer::create(lib->getTech(), "TOP", dbTechLayerType::ROUTING);
283+
dbMaster* master = dbMaster::create(lib, "BUMP");
284+
master->setWidth(10000);
285+
master->setHeight(10000);
286+
master->setOrigin(5000, 5000);
287+
master->setType(dbMasterType::COVER_BUMP);
288+
dbMTerm* term
289+
= dbMTerm::create(master, "PAD", dbIoType::INOUT, dbSigType::SIGNAL);
290+
dbMPin* bot_pin = dbMPin::create(term);
291+
dbBox::create(bot_pin, bot_layer, -1000, -1000, 1000, 1000);
292+
dbMPin* pin = dbMPin::create(term);
293+
dbBox::create(pin, layer, -2000, -2000, 2000, 2000);
294+
master->setFrozen();
295+
296+
// Create BTerms
297+
dbBlock* block = db_->getChip()->getBlock();
298+
dbNet* net = dbNet::create(block, "SIG1");
299+
dbBTerm::create(net, "TERM1");
300+
dbBTerm::create(net, "TERM2");
301+
block->setDieArea(Rect(0, 0, 500, 500));
302+
303+
EXPECT_EQ(block->getInsts().size(), 0);
304+
305+
ThreeDBlox parser(&logger_, db_.get());
306+
std::string path = getFilePath(prefix + "data/example3.bmap");
307+
try {
308+
parser.readBMap(path);
309+
FAIL() << "Expected exception for multiple BTerms connected to same net.";
310+
} catch (const std::runtime_error&) {
311+
}
312+
}
313+
314+
TEST_F(SimpleDbFixture, test_bump_map_reader_no_bterms)
315+
{
316+
createSimpleDB();
317+
318+
db_->setDbuPerMicron(1000);
319+
320+
// Create BUMP master
321+
dbLib* lib = db_->findLib("lib1");
322+
dbTechLayer* bot_layer
323+
= dbTechLayer::create(lib->getTech(), "BOT", dbTechLayerType::ROUTING);
324+
dbTechLayer* layer
325+
= dbTechLayer::create(lib->getTech(), "TOP", dbTechLayerType::ROUTING);
326+
dbMaster* master = dbMaster::create(lib, "BUMP");
327+
master->setWidth(10000);
328+
master->setHeight(10000);
329+
master->setOrigin(5000, 5000);
330+
master->setType(dbMasterType::COVER_BUMP);
331+
dbMTerm* term
332+
= dbMTerm::create(master, "PAD", dbIoType::INOUT, dbSigType::SIGNAL);
333+
dbMPin* bot_pin = dbMPin::create(term);
334+
dbBox::create(bot_pin, bot_layer, -1000, -1000, 1000, 1000);
335+
dbMPin* pin = dbMPin::create(term);
336+
dbBox::create(pin, layer, -2000, -2000, 2000, 2000);
337+
master->setFrozen();
338+
339+
// Create BTerms
340+
dbBlock* block = db_->getChip()->getBlock();
341+
dbNet::create(block, "SIG1");
342+
block->setDieArea(Rect(0, 0, 500, 500));
343+
344+
EXPECT_EQ(block->getInsts().size(), 0);
345+
346+
ThreeDBlox parser(&logger_, db_.get());
347+
std::string path = getFilePath(prefix + "data/example3.bmap");
348+
try {
349+
parser.readBMap(path);
350+
FAIL() << "Expected exception for no BTerms connected to net.";
351+
} catch (const std::runtime_error&) {
352+
}
353+
}
354+
204355
} // namespace
205356
} // namespace odb

src/odb/test/data/example2.bmap

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# bumpInstName bumpCellType x y portName netName
2+
bump1 BUMP 100.0 200.0 - SIG1
3+
bump2 BUMP 150.0 200.0 - SIG2

src/odb/test/data/example3.bmap

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# bumpInstName bumpCellType x y portName netName
2+
bump1 BUMP 100.0 200.0 - SIG1
3+
bump2 BUMP 150.0 200.0 - SIG1

0 commit comments

Comments
 (0)