Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/odb/include/odb/db.h
Original file line number Diff line number Diff line change
Expand Up @@ -7020,6 +7020,10 @@ class dbChip : public dbObject

dbSet<dbChipNet> getChipNets() const;

dbChipInst* findChipInst(const std::string& name) const;

dbChipRegion* findChipRegion(const std::string& name) const;

///
/// Create a new chip.
/// Returns nullptr if there is no database technology.
Expand Down Expand Up @@ -7129,6 +7133,8 @@ class dbChipInst : public dbObject

dbSet<dbChipRegionInst> getRegions() const;

dbChipRegionInst* findChipRegionInst(const std::string& name) const;

static odb::dbChipInst* create(dbChip* parent_chip,
dbChip* master_chip,
const std::string& name);
Expand Down
10 changes: 10 additions & 0 deletions src/odb/src/codeGenerator/schema/chip/dbChip.json
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,16 @@
"type": "dbId<_dbChipNet>",
"flags": ["private"],
"schema": "db_schema_chip_bump"
},
{
"name": "chipinsts_map_",
"type": "std::unordered_map<std::string, dbId<_dbChipInst>>",
"flags": ["private", "no-serial"]
},
{
"name": "chip_region_map_",
"type": "std::unordered_map<std::string, dbId<_dbChipRegion>>",
"flags": ["private", "no-serial"]
}
],
"declared_classes": ["dbPropertyItr", "_dbNameCache","dbBlockItr"],
Expand Down
5 changes: 5 additions & 0 deletions src/odb/src/codeGenerator/schema/chip/dbChipInst.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@
"type":"dbId<_dbChipRegionInst>",
"flags":["private"],
"schema":"db_schema_chip_region"
},
{
"name":"region_insts_map_",
"type":"std::unordered_map<std::string, dbId<_dbChipRegionInst>>",
"flags":["private", "no-serial"]
}
],
"h_includes": [
Expand Down
28 changes: 28 additions & 0 deletions src/odb/src/db/dbChip.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
// Generator Code Begin Cpp
#include "dbChip.h"

#include <string>
#include <unordered_map>

#include "dbBlock.h"
#include "dbBlockItr.h"
#include "dbChipConn.h"
Expand Down Expand Up @@ -223,6 +226,10 @@ dbIStream& operator>>(dbIStream& stream, _dbChip& obj)
if (obj.getDatabase()->isSchema(db_schema_chip_hash_table)) {
stream >> obj._next_entry;
}
auto chip = (dbChip*) &obj;
for (const auto& chip_region : chip->getChipRegions()) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't chipinsts_map_ need to be populated too?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it is in the dbDatabase.cpp

obj.chip_region_map_[chip_region->getName()] = chip_region->getId();
}
// User Code End >>
return stream;
}
Expand Down Expand Up @@ -546,6 +553,27 @@ dbSet<dbChipNet> dbChip::getChipNets() const
return dbSet<dbChipNet>(chip, db->chip_net_itr_);
}

dbChipInst* dbChip::findChipInst(const std::string& name) const
{
_dbChip* chip = (_dbChip*) this;
auto it = chip->chipinsts_map_.find(name);
if (it != chip->chipinsts_map_.end()) {
auto db = (_dbDatabase*) chip->getOwner();
return (dbChipInst*) db->chip_inst_tbl_->getPtr((*it).second);
}
return nullptr;
}

dbChipRegion* dbChip::findChipRegion(const std::string& name) const
{
_dbChip* chip = (_dbChip*) this;
auto it = chip->chip_region_map_.find(name);
if (it != chip->chip_region_map_.end()) {
return (dbChipRegion*) chip->chip_region_tbl_->getPtr((*it).second);
}
return nullptr;
}

dbChip* dbChip::create(dbDatabase* db_, const std::string& name, ChipType type)
{
_dbDatabase* db = (_dbDatabase*) db_;
Expand Down
5 changes: 5 additions & 0 deletions src/odb/src/db/dbChip.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
// Generator Code Begin Header
#pragma once

#include <string>
#include <unordered_map>

#include "dbCore.h"
#include "odb/geom.h"
#include "odb/odb.h"
Expand Down Expand Up @@ -60,6 +63,8 @@ class _dbChip : public _dbObject
dbId<_dbChipInst> chipinsts_;
dbId<_dbChipConn> conns_;
dbId<_dbChipNet> nets_;
std::unordered_map<std::string, dbId<_dbChipInst>> chipinsts_map_;
std::unordered_map<std::string, dbId<_dbChipRegion>> chip_region_map_;
dbTable<_dbProperty>* _prop_tbl;
dbTable<_dbChipRegion>* chip_region_tbl_;
dbId<_dbChip> _next_entry;
Expand Down
22 changes: 22 additions & 0 deletions src/odb/src/db/dbChipInst.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "dbChipInst.h"

#include <string>
#include <unordered_map>

#include "dbDatabase.h"
#include "dbTable.h"
Expand Down Expand Up @@ -161,6 +162,17 @@ dbSet<dbChipRegionInst> dbChipInst::getRegions() const
return dbSet<dbChipRegionInst>(_chipinst, _db->chip_region_inst_itr_);
}

dbChipRegionInst* dbChipInst::findChipRegionInst(const std::string& name) const
{
_dbChipInst* obj = (_dbChipInst*) this;
auto it = obj->region_insts_map_.find(name);
if (it != obj->region_insts_map_.end()) {
auto db = (_dbDatabase*) obj->getOwner();
return (dbChipRegionInst*) db->chip_region_inst_tbl_->getPtr((*it).second);
}
return nullptr;
}

dbChipInst* dbChipInst::create(dbChip* parent_chip,
dbChip* master_chip,
const std::string& name)
Expand All @@ -183,6 +195,13 @@ dbChipInst* dbChipInst::create(dbChip* parent_chip,
db->getLogger()->error(
utl::ODB, 507, "Cannot create chip instance {} in itself", name);
}
if (parent_chip->findChipInst(name) != nullptr) {
db->getLogger()->error(utl::ODB,
514,
"Chip instance {} already exists in parent chip {}",
name,
parent_chip->getName());
}

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

// create chipRegionInsts
for (auto region : master_chip->getChipRegions()) {
Expand All @@ -206,6 +226,7 @@ dbChipInst* dbChipInst::create(dbChip* parent_chip,
regioninst->parent_chipinst_ = chipinst->getOID();
regioninst->chip_region_inst_next_ = chipinst->chip_region_insts_;
chipinst->chip_region_insts_ = regioninst->getOID();
chipinst->region_insts_map_[region->getName()] = regioninst->getOID();
// create chipBumpInsts
for (auto bump : region->getChipBumps()) {
_dbChipBumpInst* bumpinst = db->chip_bump_inst_tbl_->create();
Expand Down Expand Up @@ -245,6 +266,7 @@ void dbChipInst::destroy(dbChipInst* chipInst)
}
// Get parent chip
_dbChip* parent = db->chip_tbl_->getPtr(inst->parent_chip_);
parent->chipinsts_map_.erase(inst->name_);

// Remove from parent's linked list
if (parent->chipinsts_ == inst->getOID()) {
Expand Down
2 changes: 2 additions & 0 deletions src/odb/src/db/dbChipInst.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#pragma once

#include <string>
#include <unordered_map>

#include "dbCore.h"
#include "odb/dbTypes.h"
Expand Down Expand Up @@ -35,6 +36,7 @@ class _dbChipInst : public _dbObject
dbId<_dbChip> parent_chip_;
dbId<_dbChipInst> chipinst_next_;
dbId<_dbChipRegionInst> chip_region_insts_;
std::unordered_map<std::string, dbId<_dbChipRegionInst>> region_insts_map_;
};
dbIStream& operator>>(dbIStream& stream, _dbChipInst& obj);
dbOStream& operator<<(dbOStream& stream, const _dbChipInst& obj);
Expand Down
11 changes: 10 additions & 1 deletion src/odb/src/db/dbChipRegion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,11 +186,20 @@ dbChipRegion* dbChipRegion::create(dbChip* chip,
layer->getName());
}
}
if (chip->findChipRegion(name) != nullptr) {
logger->error(
utl::ODB,
520,
"Cannot create chip region {} for chip {} because chip region "
"already exists",
name,
chip->getName());
}
_dbTechLayer* _layer = (_dbTechLayer*) layer;

// Create a new chip region
_dbChipRegion* chip_region = _chip->chip_region_tbl_->create();

_chip->chip_region_map_[name] = chip_region->getOID();
// Initialize the chip region
chip_region->name_ = name;
chip_region->side_ = static_cast<uint8_t>(side);
Expand Down
13 changes: 13 additions & 0 deletions src/odb/src/db/dbDatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,19 @@ dbIStream& operator>>(dbIStream& stream, _dbDatabase& obj)
// Set the revision of the database to the current revision
obj._schema_major = db_schema_major;
obj._schema_minor = db_schema_minor;

// Set the chipinsts_map_ of the chip
dbDatabase* db = (dbDatabase*) &obj;
for (const auto& inst : db->getChipInsts()) {
_dbChip* parent_chip = (_dbChip*) inst->getParentChip();
parent_chip->chipinsts_map_[inst->getName()] = inst->getId();
}
// Set the region_insts_map_ of the chipinst
for (const auto& chip_region_inst : db->getChipRegionInsts()) {
_dbChipInst* chipinst = (_dbChipInst*) chip_region_inst->getChipInst();
chipinst->region_insts_map_[chip_region_inst->getChipRegion()->getName()]
= chip_region_inst->getId();
}
// User Code End >>
return stream;
}
Expand Down
26 changes: 26 additions & 0 deletions src/odb/test/cpp/TestChips.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,12 @@ BOOST_FIXTURE_TEST_CASE(test_chip_creation, F_CHIP_HIERARCHY)
BOOST_TEST(db->getChips().size() == 4);
BOOST_TEST(db->findChip("cpu_chip") == nullptr);
BOOST_TEST(db->getChip() == nullptr);
try {
dbChipInst::create(system_chip, cpu_chip, "cpu_inst");
BOOST_TEST(false);
} catch (const std::exception& e) {
BOOST_TEST(true);
}
}

BOOST_FIXTURE_TEST_CASE(test_chip_hierarchy, F_CHIP_HIERARCHY)
Expand Down Expand Up @@ -170,6 +176,9 @@ BOOST_FIXTURE_TEST_CASE(test_chip_hierarchy, F_CHIP_HIERARCHY)
BOOST_TEST(memory_inst->getParentChip() == system_chip);
BOOST_TEST(io_inst->getParentChip() == system_chip);
BOOST_TEST(cache_inst->getParentChip() == cpu_chip);
BOOST_TEST(system_chip->findChipInst("cpu_inst") == cpu_inst);
BOOST_TEST(cpu_chip->findChipInst("cache_inst") == cache_inst);
BOOST_TEST(system_chip->findChipInst("cache_inst") == nullptr);

// Verify master relationships
BOOST_TEST(cpu_inst->getMasterChip() == cpu_chip);
Expand Down Expand Up @@ -222,7 +231,10 @@ BOOST_FIXTURE_TEST_CASE(test_chip_complex_destroy, F_CHIP_HIERARCHY)
BOOST_TEST(db->getChipBumpInsts().size() == 0);
BOOST_TEST(db->getChipRegionInsts().size() == 0);
BOOST_TEST(system_chip->getChipInsts().size() == 0);
BOOST_TEST(system_chip->findChipInst("cpu_inst") == nullptr);
BOOST_TEST(system_chip->findChipInst("io_inst") == nullptr);
}

BOOST_FIXTURE_TEST_CASE(test_chip_regions, F_CHIP_HIERARCHY)
{
auto iterateChipRegions = [](dbChip* chip,
Expand All @@ -248,6 +260,20 @@ BOOST_FIXTURE_TEST_CASE(test_chip_regions, F_CHIP_HIERARCHY)
BOOST_TEST(
(memory_chip_region_r3->getSide() == dbChipRegion::Side::INTERNAL));
BOOST_TEST(memory_chip_region_r3->getLayer() == nullptr);
// Test dbChip::findChipRegion
BOOST_TEST(memory_chip->findChipRegion("R1") == memory_chip_region_r1);
BOOST_TEST(memory_chip->findChipRegion("R2") == memory_chip_region_r2);
BOOST_TEST(memory_chip->findChipRegion("R3") == memory_chip_region_r3);
BOOST_TEST(memory_chip->findChipRegion("R4") == nullptr);
// Test dbChipInst::findChipRegionInst
BOOST_TEST(memory_inst->findChipRegionInst("R1")->getChipRegion()
== memory_chip_region_r1);
BOOST_TEST(memory_inst->findChipRegionInst("R2")->getChipRegion()
== memory_chip_region_r2);
BOOST_TEST(memory_inst->findChipRegionInst("R3")->getChipRegion()
== memory_chip_region_r3);
BOOST_TEST(memory_inst->findChipRegionInst("R4") == nullptr);

iterateChipRegions(memory_chip, {"R1", "R2", "R3"});
iterateChipRegionInsts(memory_inst, {"R1", "R2", "R3"});
iterateChipRegions(io_chip, {"R1"});
Expand Down