Skip to content

Commit 46ac421

Browse files
committed
Move access point swapMaster test to odb
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
1 parent ea37d99 commit 46ac421

5 files changed

Lines changed: 46 additions & 127 deletions

File tree

src/odb/src/db/dbInst.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,7 @@ bool dbInst::swapMaster(dbMaster* new_master_)
12201220
dbITerm* iterm = (dbITerm*) block->iterm_tbl_->getPtr(iterm_id);
12211221
iterm->clearPrefAccessPoints();
12221222
}
1223+
inst->pin_access_idx_ = -1;
12231224

12241225
// remove reference to inst_hdr
12251226
_dbInstHdr* old_inst_hdr

src/odb/test/cpp/TestAccessPoint.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <cstdint>
12
#include <filesystem>
23
#include <fstream>
34
#include <ios>
@@ -76,5 +77,49 @@ TEST_F(SimpleDbFixture, test_default)
7677
dbDatabase::destroy(db2);
7778
}
7879

80+
TEST_F(SimpleDbFixture, SwapMasterClearsAndInvalidatesAccessPoints)
81+
{
82+
createSimpleDB();
83+
dbBlock* block = db_->getChip()->getBlock();
84+
dbLib* lib = db_->findLib("lib1");
85+
ASSERT_NE(lib, nullptr);
86+
dbMaster* old_master = db_->findMaster("and2");
87+
ASSERT_NE(old_master, nullptr);
88+
dbMaster* new_master
89+
= createMaster2X1(lib, "and2_x4", 2000, 1000, "a", "b", "o");
90+
ASSERT_NE(new_master, nullptr);
91+
dbMTerm* old_term = old_master->findMTerm("a");
92+
ASSERT_NE(old_term, nullptr);
93+
dbMTerm* new_term = new_master->findMTerm("a");
94+
ASSERT_NE(new_term, nullptr);
95+
96+
// Create APs on both masters so a stale pin-access index would be visible.
97+
dbMPin* old_pin = dbMPin::create(old_term);
98+
ASSERT_NE(old_pin, nullptr);
99+
dbAccessPoint* old_ap = dbAccessPoint::create(block, old_pin, 0);
100+
ASSERT_NE(old_ap, nullptr);
101+
dbMPin* new_pin = dbMPin::create(new_term);
102+
ASSERT_NE(new_pin, nullptr);
103+
dbAccessPoint* new_ap = dbAccessPoint::create(block, new_pin, 0);
104+
ASSERT_NE(new_ap, nullptr);
105+
106+
dbInst* inst = dbInst::create(block, old_master, "i1");
107+
ASSERT_NE(inst, nullptr);
108+
dbITerm* iterm = inst->getITerm(old_term);
109+
ASSERT_NE(iterm, nullptr);
110+
inst->setPinAccessIdx(0);
111+
iterm->setAccessPoint(old_pin, old_ap);
112+
ASSERT_EQ(iterm->getPrefAccessPoints().size(), 1);
113+
ASSERT_EQ(iterm->getAccessPoints().at(old_pin).size(), 1);
114+
115+
ASSERT_TRUE(inst->swapMaster(new_master));
116+
dbITerm* swapped_iterm = inst->findITerm("a");
117+
ASSERT_NE(swapped_iterm, nullptr);
118+
119+
EXPECT_EQ(inst->getPinAccessIdx(), static_cast<uint32_t>(-1));
120+
EXPECT_TRUE(swapped_iterm->getPrefAccessPoints().empty());
121+
EXPECT_TRUE(swapped_iterm->getAccessPoints().empty());
122+
}
123+
79124
} // namespace
80125
} // namespace odb

src/rsz/test/BUILD

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -379,12 +379,9 @@ cc_test(
379379
"Nangate45/Nangate45.lef",
380380
"Nangate45/Nangate45_typ.lib",
381381
] + glob(["cpp/TestBufferRemoval3*.v"]),
382-
features = ["-layering_check"],
383382
deps = [
384383
"//src/dbSta",
385384
"//src/dbSta:dbNetwork",
386-
"//src/drt",
387-
"//src/dst",
388385
"//src/odb",
389386
"//src/sta:opensta_lib",
390387
"//src/tst:integrated_fixture",
@@ -401,12 +398,9 @@ cc_test(
401398
"Nangate45/Nangate45.lef",
402399
"Nangate45/Nangate45_typ.lib",
403400
] + glob(["cpp/TestBufferRemoval3*.v"]),
404-
features = ["-layering_check"],
405401
deps = [
406402
"//src/dbSta",
407403
"//src/dbSta:dbNetwork",
408-
"//src/drt",
409-
"//src/dst",
410404
"//src/odb",
411405
"//src/sta:opensta_lib",
412406
"//src/tst:integrated_fixture",

src/rsz/test/cpp/CMakeLists.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,6 @@ target_link_libraries(TestBufferRemoval3
6868
utl_lib
6969
rsz_lib
7070
grt_lib
71-
drt_lib
72-
dst_lib
7371
dpl_lib
7472
stt_lib
7573
odb
@@ -80,7 +78,6 @@ target_link_libraries(TestBufferRemoval3
8078
target_include_directories(TestBufferRemoval3
8179
PRIVATE
8280
${PROJECT_SOURCE_DIR}/src/rsz/src
83-
${PROJECT_SOURCE_DIR}/src/drt/src
8481
)
8582

8683
gtest_discover_tests(TestBufferRemoval3

src/rsz/test/cpp/TestBufferRemoval3.cc

Lines changed: 0 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,12 @@
66
#include <iterator>
77
#include <memory>
88
#include <string>
9-
#include <vector>
109

11-
#include "../../../odb/src/db/dbAccessPoint.h"
12-
#include "AbstractGraphicsFactory.h"
1310
#include "db_sta/dbSta.hh"
14-
#include "dr/AbstractDRGraphics.h"
15-
#include "drt/TritonRoute.h"
16-
#include "dst/Distributed.h"
1711
#include "gtest/gtest.h"
1812
#include "odb/db.h"
19-
#include "pa/AbstractPAGraphics.h"
2013
#include "sta/NetworkClass.hh"
2114
#include "sta/VerilogWriter.hh"
22-
#include "ta/AbstractTAGraphics.h"
2315
#include "tst/IntegratedFixture.h"
2416
#include "utl/Logger.h"
2517

@@ -40,116 +32,6 @@ class BufRemTest3 : public tst::IntegratedFixture
4032
bool debug_ = false; // Set to true to generate debug output
4133
};
4234

43-
// Dummy GraphicsFactory for drt.initGraphics(). Needed for drt.pinAccess()
44-
class NullGraphicsFactory : public drt::AbstractGraphicsFactory
45-
{
46-
public:
47-
void reset(drt::frDebugSettings*,
48-
drt::frDesign*,
49-
odb::dbDatabase*,
50-
utl::Logger*,
51-
drt::RouterConfiguration*) override
52-
{
53-
}
54-
55-
bool guiActive() override { return false; }
56-
57-
std::unique_ptr<drt::AbstractDRGraphics> makeUniqueDRGraphics() override
58-
{
59-
return nullptr;
60-
}
61-
62-
std::unique_ptr<drt::AbstractTAGraphics> makeUniqueTAGraphics() override
63-
{
64-
return nullptr;
65-
}
66-
67-
std::unique_ptr<drt::AbstractPAGraphics> makeUniquePAGraphics() override
68-
{
69-
return nullptr;
70-
}
71-
};
72-
73-
static void addTrackGrid(odb::dbBlock* block, const char* layer_name)
74-
{
75-
odb::dbTechLayer* layer = block->getTech()->findLayer(layer_name);
76-
ASSERT_NE(layer, nullptr);
77-
odb::dbTrackGrid* grid = block->findTrackGrid(layer);
78-
if (grid == nullptr) {
79-
grid = odb::dbTrackGrid::create(block, layer);
80-
}
81-
ASSERT_NE(grid, nullptr);
82-
grid->addGridPatternX(0, 200, 190);
83-
grid->addGridPatternY(0, 200, 190);
84-
}
85-
86-
static void addBPinShape(odb::dbBlock* block,
87-
const char* bterm_name,
88-
const int x,
89-
const int y)
90-
{
91-
odb::dbBTerm* bterm = block->findBTerm(bterm_name);
92-
ASSERT_NE(bterm, nullptr);
93-
odb::dbTechLayer* layer = block->getTech()->findLayer("metal2");
94-
ASSERT_NE(layer, nullptr);
95-
odb::dbBPin* bpin = odb::dbBPin::create(bterm);
96-
ASSERT_NE(bpin, nullptr);
97-
odb::dbBox* box = odb::dbBox::create(bpin, layer, x, y, x + 190, y + 190);
98-
ASSERT_NE(box, nullptr);
99-
bpin->setPlacementStatus(odb::dbPlacementStatus::PLACED);
100-
}
101-
102-
// Reproduce the failing sizeup,buffer ECO sequence.
103-
// 1. DRT pinAccess first sets a preferred AP and its back-reference.
104-
// 2. A sizeup-like swapMaster then changes the current MTerm/MPin context
105-
// before Resizer removes the buffer.
106-
// 3. Buffer destruction must clear the AP back-reference.
107-
TEST_F(BufRemTest3, RemoveBufferAfterSwapMaster)
108-
{
109-
readVerilogAndSetup("TestBufferRemoval3_9.v");
110-
111-
block_->setDieArea(odb::Rect(0, 0, 40000, 40000));
112-
for (const char* layer_name :
113-
{"metal1", "metal2", "metal3", "metal4", "metal5"}) {
114-
addTrackGrid(block_, layer_name);
115-
}
116-
addBPinShape(block_, "clk", 0, 2000);
117-
addBPinShape(block_, "in", 0, 4000);
118-
addBPinShape(block_, "out", 2000, 4000);
119-
120-
odb::dbInst* buf_inst = block_->findInst("buf1");
121-
ASSERT_NE(buf_inst, nullptr);
122-
buf_inst->setLocation(0, 0);
123-
buf_inst->setPlacementStatus(odb::dbPlacementStatus::PLACED);
124-
125-
dst::Distributed dist(&logger_);
126-
drt::TritonRoute drt(db_.get(), &logger_, &service_registry_, &dist, &stt_);
127-
drt.initGraphics(std::make_unique<NullGraphicsFactory>());
128-
drt.pinAccess();
129-
130-
odb::dbITerm* buf_a = buf_inst->findITerm("A");
131-
ASSERT_NE(buf_a, nullptr);
132-
const std::vector<odb::dbAccessPoint*> pref_aps
133-
= buf_a->getPrefAccessPoints();
134-
ASSERT_FALSE(pref_aps.empty());
135-
odb::_dbAccessPoint* ap_impl
136-
= static_cast<odb::_dbAccessPoint*>(pref_aps[0]->getImpl());
137-
ASSERT_EQ(ap_impl->iterms_.size(), 1U);
138-
139-
odb::dbMaster* sized_master = db_->findMaster("BUF_X4");
140-
ASSERT_NE(sized_master, nullptr);
141-
ASSERT_TRUE(buf_inst->swapMaster(sized_master));
142-
143-
sta::Instance* sta_buf = db_network_->dbToSta(buf_inst);
144-
ASSERT_NE(sta_buf, nullptr);
145-
sta::InstanceSeq insts;
146-
insts.emplace_back(sta_buf);
147-
resizer_.removeBuffers(insts);
148-
149-
EXPECT_EQ(block_->findInst("buf1"), nullptr);
150-
EXPECT_TRUE(ap_impl->iterms_.empty());
151-
}
152-
15335
TEST_F(BufRemTest3, RemoveBufferCase9)
15436
{
15537
std::string test_name = "TestBufferRemoval3_9";

0 commit comments

Comments
 (0)