@@ -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
0 commit comments