|
2 | 2 | #include <string> |
3 | 3 |
|
4 | 4 | #include "gtest/gtest.h" |
| 5 | +#include "helper.h" |
5 | 6 | #include "odb/3dblox.h" |
6 | 7 | #include "odb/db.h" |
7 | 8 | #include "odb/geom.h" |
@@ -133,5 +134,75 @@ TEST_F(DbvFixture, test_bump_map_parser) |
133 | 134 | EXPECT_EQ(bump_inst->getChipRegionInst(), region_inst); |
134 | 135 | } |
135 | 136 |
|
| 137 | +TEST_F(SimpleDbFixture, test_bump_map_reader) |
| 138 | +{ |
| 139 | + createSimpleDB(); |
| 140 | + |
| 141 | + db_->setDbuPerMicron(1000); |
| 142 | + |
| 143 | + // Create BUMP master |
| 144 | + dbLib* lib = db_->findLib("lib1"); |
| 145 | + dbTechLayer* layer |
| 146 | + = dbTechLayer::create(lib->getTech(), "TOP", dbTechLayerType::ROUTING); |
| 147 | + dbMaster* master = dbMaster::create(lib, "BUMP"); |
| 148 | + master->setWidth(10000); |
| 149 | + master->setHeight(10000); |
| 150 | + master->setOrigin(5000, 5000); |
| 151 | + master->setType(dbMasterType::COVER_BUMP); |
| 152 | + dbMTerm* term |
| 153 | + = dbMTerm::create(master, "PAD", dbIoType::INOUT, dbSigType::SIGNAL); |
| 154 | + dbMPin* pin = dbMPin::create(term); |
| 155 | + dbBox::create(pin, layer, -2000, -2000, 2000, 2000); |
| 156 | + master->setFrozen(); |
| 157 | + |
| 158 | + // Create BTerms |
| 159 | + dbBlock* block = db_->getChip()->getBlock(); |
| 160 | + dbBTerm* SIG1 = dbBTerm::create(dbNet::create(block, "SIG1"), "SIG1"); |
| 161 | + dbBTerm* SIG2 = dbBTerm::create(dbNet::create(block, "SIG2"), "SIG2"); |
| 162 | + block->setDieArea(Rect(0, 0, 500, 500)); |
| 163 | + |
| 164 | + EXPECT_EQ(block->getInsts().size(), 0); |
| 165 | + |
| 166 | + ThreeDBlox parser(&logger_, db_.get()); |
| 167 | + std::string path = getFilePath(prefix + "data/example1.bmap"); |
| 168 | + parser.readBMap(path, false); |
| 169 | + |
| 170 | + // Check bumps were created |
| 171 | + EXPECT_EQ(block->getInsts().size(), 2); |
| 172 | + dbInst* inst1 = block->findInst("bump1"); |
| 173 | + EXPECT_EQ(inst1->getBBox()->getBox().xCenter(), 100 * 1000); |
| 174 | + EXPECT_EQ(inst1->getBBox()->getBox().yCenter(), 200 * 1000); |
| 175 | + dbInst* inst2 = block->findInst("bump2"); |
| 176 | + EXPECT_EQ(inst2->getBBox()->getBox().xCenter(), 150 * 1000); |
| 177 | + EXPECT_EQ(inst2->getBBox()->getBox().yCenter(), 200 * 1000); |
| 178 | + |
| 179 | + // Check that no BPins where added |
| 180 | + EXPECT_EQ(SIG1->getBPins().size(), 0); |
| 181 | + EXPECT_EQ(SIG2->getBPins().size(), 0); |
| 182 | + |
| 183 | + // Read bmap again to add bpins |
| 184 | + parser.readBMap(path, true); |
| 185 | + |
| 186 | + // Check that BPins where added |
| 187 | + EXPECT_EQ(SIG1->getBPins().size(), 1); |
| 188 | + EXPECT_EQ(SIG2->getBPins().size(), 1); |
| 189 | + EXPECT_EQ(SIG1->getBPins().begin()->getBoxes().size(), 1); |
| 190 | + EXPECT_EQ(SIG2->getBPins().begin()->getBoxes().size(), 1); |
| 191 | + |
| 192 | + // Check bPin shape and layer |
| 193 | + dbBox* sig1_box = *SIG1->getBPins().begin()->getBoxes().begin(); |
| 194 | + dbBox* sig2_box = *SIG2->getBPins().begin()->getBoxes().begin(); |
| 195 | + EXPECT_EQ(sig1_box->getTechLayer(), layer); |
| 196 | + EXPECT_EQ(sig1_box->getBox().xMin(), 98000); |
| 197 | + EXPECT_EQ(sig1_box->getBox().yMin(), 198000); |
| 198 | + EXPECT_EQ(sig1_box->getBox().xMax(), 102000); |
| 199 | + EXPECT_EQ(sig1_box->getBox().yMax(), 202000); |
| 200 | + EXPECT_EQ(sig2_box->getTechLayer(), layer); |
| 201 | + EXPECT_EQ(sig2_box->getBox().xMin(), 148000); |
| 202 | + EXPECT_EQ(sig2_box->getBox().yMin(), 198000); |
| 203 | + EXPECT_EQ(sig2_box->getBox().xMax(), 152000); |
| 204 | + EXPECT_EQ(sig2_box->getBox().yMax(), 202000); |
| 205 | +} |
| 206 | + |
136 | 207 | } // namespace |
137 | 208 | } // namespace odb |
0 commit comments