Skip to content

Commit 9765677

Browse files
authored
Merge pull request #8230 from osamahammad21/odb-chip-maps
odb: name mapping for chip objects
2 parents b57dad1 + ad67756 commit 9765677

File tree

10 files changed

+142
-1
lines changed

10 files changed

+142
-1
lines changed

src/odb/include/odb/db.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7020,6 +7020,10 @@ class dbChip : public dbObject
70207020

70217021
dbSet<dbChipNet> getChipNets() const;
70227022

7023+
dbChipInst* findChipInst(const std::string& name) const;
7024+
7025+
dbChipRegion* findChipRegion(const std::string& name) const;
7026+
70237027
///
70247028
/// Create a new chip.
70257029
/// Returns nullptr if there is no database technology.
@@ -7129,6 +7133,10 @@ class dbChipInst : public dbObject
71297133

71307134
dbSet<dbChipRegionInst> getRegions() const;
71317135

7136+
dbChipRegionInst* findChipRegionInst(dbChipRegion* chip_region) const;
7137+
7138+
dbChipRegionInst* findChipRegionInst(const std::string& name) const;
7139+
71327140
static odb::dbChipInst* create(dbChip* parent_chip,
71337141
dbChip* master_chip,
71347142
const std::string& name);

src/odb/src/codeGenerator/schema/chip/dbChip.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,16 @@
160160
"type": "dbId<_dbChipNet>",
161161
"flags": ["private"],
162162
"schema": "db_schema_chip_bump"
163+
},
164+
{
165+
"name": "chipinsts_map_",
166+
"type": "std::unordered_map<std::string, dbId<_dbChipInst>>",
167+
"flags": ["private", "no-serial"]
168+
},
169+
{
170+
"name": "chip_region_map_",
171+
"type": "std::unordered_map<std::string, dbId<_dbChipRegion>>",
172+
"flags": ["private", "no-serial"]
163173
}
164174
],
165175
"declared_classes": ["dbPropertyItr", "_dbNameCache","dbBlockItr"],

src/odb/src/codeGenerator/schema/chip/dbChipInst.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@
3939
"type":"dbId<_dbChipRegionInst>",
4040
"flags":["private"],
4141
"schema":"db_schema_chip_region"
42+
},
43+
{
44+
"name":"region_insts_map_",
45+
"type":"std::unordered_map<dbId<_dbChipRegion>, dbId<_dbChipRegionInst>>",
46+
"flags":["private", "no-serial", "no-template"]
4247
}
4348
],
4449
"h_includes": [

src/odb/src/db/dbChip.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
// Generator Code Begin Cpp
55
#include "dbChip.h"
66

7+
#include <string>
8+
#include <unordered_map>
9+
710
#include "dbBlock.h"
811
#include "dbBlockItr.h"
912
#include "dbChipConn.h"
@@ -223,6 +226,10 @@ dbIStream& operator>>(dbIStream& stream, _dbChip& obj)
223226
if (obj.getDatabase()->isSchema(db_schema_chip_hash_table)) {
224227
stream >> obj._next_entry;
225228
}
229+
auto chip = (dbChip*) &obj;
230+
for (const auto& chip_region : chip->getChipRegions()) {
231+
obj.chip_region_map_[chip_region->getName()] = chip_region->getId();
232+
}
226233
// User Code End >>
227234
return stream;
228235
}
@@ -546,6 +553,27 @@ dbSet<dbChipNet> dbChip::getChipNets() const
546553
return dbSet<dbChipNet>(chip, db->chip_net_itr_);
547554
}
548555

556+
dbChipInst* dbChip::findChipInst(const std::string& name) const
557+
{
558+
_dbChip* chip = (_dbChip*) this;
559+
auto it = chip->chipinsts_map_.find(name);
560+
if (it != chip->chipinsts_map_.end()) {
561+
auto db = (_dbDatabase*) chip->getOwner();
562+
return (dbChipInst*) db->chip_inst_tbl_->getPtr((*it).second);
563+
}
564+
return nullptr;
565+
}
566+
567+
dbChipRegion* dbChip::findChipRegion(const std::string& name) const
568+
{
569+
_dbChip* chip = (_dbChip*) this;
570+
auto it = chip->chip_region_map_.find(name);
571+
if (it != chip->chip_region_map_.end()) {
572+
return (dbChipRegion*) chip->chip_region_tbl_->getPtr((*it).second);
573+
}
574+
return nullptr;
575+
}
576+
549577
dbChip* dbChip::create(dbDatabase* db_, const std::string& name, ChipType type)
550578
{
551579
_dbDatabase* db = (_dbDatabase*) db_;

src/odb/src/db/dbChip.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
// Generator Code Begin Header
55
#pragma once
66

7+
#include <string>
8+
#include <unordered_map>
9+
710
#include "dbCore.h"
811
#include "odb/geom.h"
912
#include "odb/odb.h"
@@ -60,6 +63,8 @@ class _dbChip : public _dbObject
6063
dbId<_dbChipInst> chipinsts_;
6164
dbId<_dbChipConn> conns_;
6265
dbId<_dbChipNet> nets_;
66+
std::unordered_map<std::string, dbId<_dbChipInst>> chipinsts_map_;
67+
std::unordered_map<std::string, dbId<_dbChipRegion>> chip_region_map_;
6368
dbTable<_dbProperty>* _prop_tbl;
6469
dbTable<_dbChipRegion>* chip_region_tbl_;
6570
dbId<_dbChip> _next_entry;

src/odb/src/db/dbChipInst.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "dbChipInst.h"
66

77
#include <string>
8+
#include <unordered_map>
89

910
#include "dbDatabase.h"
1011
#include "dbTable.h"
@@ -161,6 +162,26 @@ dbSet<dbChipRegionInst> dbChipInst::getRegions() const
161162
return dbSet<dbChipRegionInst>(_chipinst, _db->chip_region_inst_itr_);
162163
}
163164

165+
dbChipRegionInst* dbChipInst::findChipRegionInst(
166+
dbChipRegion* chip_region) const
167+
{
168+
if (chip_region == nullptr) {
169+
return nullptr;
170+
}
171+
_dbChipInst* obj = (_dbChipInst*) this;
172+
auto it = obj->region_insts_map_.find(chip_region->getId());
173+
if (it != obj->region_insts_map_.end()) {
174+
auto db = (_dbDatabase*) obj->getOwner();
175+
return (dbChipRegionInst*) db->chip_region_inst_tbl_->getPtr((*it).second);
176+
}
177+
return nullptr;
178+
}
179+
180+
dbChipRegionInst* dbChipInst::findChipRegionInst(const std::string& name) const
181+
{
182+
return findChipRegionInst(getMasterChip()->findChipRegion(name));
183+
}
184+
164185
dbChipInst* dbChipInst::create(dbChip* parent_chip,
165186
dbChip* master_chip,
166187
const std::string& name)
@@ -183,6 +204,13 @@ dbChipInst* dbChipInst::create(dbChip* parent_chip,
183204
db->getLogger()->error(
184205
utl::ODB, 507, "Cannot create chip instance {} in itself", name);
185206
}
207+
if (parent_chip->findChipInst(name) != nullptr) {
208+
db->getLogger()->error(utl::ODB,
209+
514,
210+
"Chip instance {} already exists in parent chip {}",
211+
name,
212+
parent_chip->getName());
213+
}
186214

187215
// Create a new chip instance
188216
_dbChipInst* chipinst = db->chip_inst_tbl_->create();
@@ -198,6 +226,7 @@ dbChipInst* dbChipInst::create(dbChip* parent_chip,
198226
// Link the chip instance to the parent chip's linked list
199227
chipinst->chipinst_next_ = _parent->chipinsts_;
200228
_parent->chipinsts_ = chipinst->getOID();
229+
_parent->chipinsts_map_[name] = chipinst->getOID();
201230

202231
// create chipRegionInsts
203232
for (auto region : master_chip->getChipRegions()) {
@@ -206,6 +235,7 @@ dbChipInst* dbChipInst::create(dbChip* parent_chip,
206235
regioninst->parent_chipinst_ = chipinst->getOID();
207236
regioninst->chip_region_inst_next_ = chipinst->chip_region_insts_;
208237
chipinst->chip_region_insts_ = regioninst->getOID();
238+
chipinst->region_insts_map_[region->getId()] = regioninst->getOID();
209239
// create chipBumpInsts
210240
for (auto bump : region->getChipBumps()) {
211241
_dbChipBumpInst* bumpinst = db->chip_bump_inst_tbl_->create();
@@ -245,6 +275,7 @@ void dbChipInst::destroy(dbChipInst* chipInst)
245275
}
246276
// Get parent chip
247277
_dbChip* parent = db->chip_tbl_->getPtr(inst->parent_chip_);
278+
parent->chipinsts_map_.erase(inst->name_);
248279

249280
// Remove from parent's linked list
250281
if (parent->chipinsts_ == inst->getOID()) {

src/odb/src/db/dbChipInst.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#pragma once
66

77
#include <string>
8+
#include <unordered_map>
89

910
#include "dbCore.h"
1011
#include "odb/dbTypes.h"
@@ -17,6 +18,9 @@ class dbOStream;
1718
class _dbDatabase;
1819
class _dbChip;
1920
class _dbChipRegionInst;
21+
// User Code Begin Classes
22+
class _dbChipRegion;
23+
// User Code End Classes
2024

2125
class _dbChipInst : public _dbObject
2226
{
@@ -35,6 +39,8 @@ class _dbChipInst : public _dbObject
3539
dbId<_dbChip> parent_chip_;
3640
dbId<_dbChipInst> chipinst_next_;
3741
dbId<_dbChipRegionInst> chip_region_insts_;
42+
std::unordered_map<dbId<_dbChipRegion>, dbId<_dbChipRegionInst>>
43+
region_insts_map_;
3844
};
3945
dbIStream& operator>>(dbIStream& stream, _dbChipInst& obj);
4046
dbOStream& operator<<(dbOStream& stream, const _dbChipInst& obj);

src/odb/src/db/dbChipRegion.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,11 +186,20 @@ dbChipRegion* dbChipRegion::create(dbChip* chip,
186186
layer->getName());
187187
}
188188
}
189+
if (chip->findChipRegion(name) != nullptr) {
190+
logger->error(
191+
utl::ODB,
192+
520,
193+
"Cannot create chip region {} for chip {} because chip region "
194+
"already exists",
195+
name,
196+
chip->getName());
197+
}
189198
_dbTechLayer* _layer = (_dbTechLayer*) layer;
190199

191200
// Create a new chip region
192201
_dbChipRegion* chip_region = _chip->chip_region_tbl_->create();
193-
202+
_chip->chip_region_map_[name] = chip_region->getOID();
194203
// Initialize the chip region
195204
chip_region->name_ = name;
196205
chip_region->side_ = static_cast<uint8_t>(side);

src/odb/src/db/dbDatabase.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,19 @@ dbIStream& operator>>(dbIStream& stream, _dbDatabase& obj)
301301
// Set the revision of the database to the current revision
302302
obj._schema_major = db_schema_major;
303303
obj._schema_minor = db_schema_minor;
304+
305+
// Set the chipinsts_map_ of the chip
306+
dbDatabase* db = (dbDatabase*) &obj;
307+
for (const auto& inst : db->getChipInsts()) {
308+
_dbChip* parent_chip = (_dbChip*) inst->getParentChip();
309+
parent_chip->chipinsts_map_[inst->getName()] = inst->getId();
310+
}
311+
// Set the region_insts_map_ of the chipinst
312+
for (const auto& chip_region_inst : db->getChipRegionInsts()) {
313+
_dbChipInst* chipinst = (_dbChipInst*) chip_region_inst->getChipInst();
314+
chipinst->region_insts_map_[chip_region_inst->getChipRegion()->getId()]
315+
= chip_region_inst->getId();
316+
}
304317
// User Code End >>
305318
return stream;
306319
}

src/odb/test/cpp/TestChips.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,12 @@ BOOST_FIXTURE_TEST_CASE(test_chip_creation, F_CHIP_HIERARCHY)
136136
BOOST_TEST(db->getChips().size() == 4);
137137
BOOST_TEST(db->findChip("cpu_chip") == nullptr);
138138
BOOST_TEST(db->getChip() == nullptr);
139+
try {
140+
dbChipInst::create(system_chip, cpu_chip, "cpu_inst");
141+
BOOST_TEST(false);
142+
} catch (const std::exception& e) {
143+
BOOST_TEST(true);
144+
}
139145
}
140146

141147
BOOST_FIXTURE_TEST_CASE(test_chip_hierarchy, F_CHIP_HIERARCHY)
@@ -170,6 +176,9 @@ BOOST_FIXTURE_TEST_CASE(test_chip_hierarchy, F_CHIP_HIERARCHY)
170176
BOOST_TEST(memory_inst->getParentChip() == system_chip);
171177
BOOST_TEST(io_inst->getParentChip() == system_chip);
172178
BOOST_TEST(cache_inst->getParentChip() == cpu_chip);
179+
BOOST_TEST(system_chip->findChipInst("cpu_inst") == cpu_inst);
180+
BOOST_TEST(cpu_chip->findChipInst("cache_inst") == cache_inst);
181+
BOOST_TEST(system_chip->findChipInst("cache_inst") == nullptr);
173182

174183
// Verify master relationships
175184
BOOST_TEST(cpu_inst->getMasterChip() == cpu_chip);
@@ -222,7 +231,10 @@ BOOST_FIXTURE_TEST_CASE(test_chip_complex_destroy, F_CHIP_HIERARCHY)
222231
BOOST_TEST(db->getChipBumpInsts().size() == 0);
223232
BOOST_TEST(db->getChipRegionInsts().size() == 0);
224233
BOOST_TEST(system_chip->getChipInsts().size() == 0);
234+
BOOST_TEST(system_chip->findChipInst("cpu_inst") == nullptr);
235+
BOOST_TEST(system_chip->findChipInst("io_inst") == nullptr);
225236
}
237+
226238
BOOST_FIXTURE_TEST_CASE(test_chip_regions, F_CHIP_HIERARCHY)
227239
{
228240
auto iterateChipRegions = [](dbChip* chip,
@@ -248,6 +260,20 @@ BOOST_FIXTURE_TEST_CASE(test_chip_regions, F_CHIP_HIERARCHY)
248260
BOOST_TEST(
249261
(memory_chip_region_r3->getSide() == dbChipRegion::Side::INTERNAL));
250262
BOOST_TEST(memory_chip_region_r3->getLayer() == nullptr);
263+
// Test dbChip::findChipRegion
264+
BOOST_TEST(memory_chip->findChipRegion("R1") == memory_chip_region_r1);
265+
BOOST_TEST(memory_chip->findChipRegion("R2") == memory_chip_region_r2);
266+
BOOST_TEST(memory_chip->findChipRegion("R3") == memory_chip_region_r3);
267+
BOOST_TEST(memory_chip->findChipRegion("R4") == nullptr);
268+
// Test dbChipInst::findChipRegionInst
269+
BOOST_TEST(memory_inst->findChipRegionInst("R1")->getChipRegion()
270+
== memory_chip_region_r1);
271+
BOOST_TEST(memory_inst->findChipRegionInst("R2")->getChipRegion()
272+
== memory_chip_region_r2);
273+
BOOST_TEST(memory_inst->findChipRegionInst("R3")->getChipRegion()
274+
== memory_chip_region_r3);
275+
BOOST_TEST(memory_inst->findChipRegionInst("R4") == nullptr);
276+
251277
iterateChipRegions(memory_chip, {"R1", "R2", "R3"});
252278
iterateChipRegionInsts(memory_inst, {"R1", "R2", "R3"});
253279
iterateChipRegions(io_chip, {"R1"});

0 commit comments

Comments
 (0)