|
| 1 | +#include <cstdint> |
1 | 2 | #include <filesystem> |
2 | 3 | #include <fstream> |
3 | 4 | #include <ios> |
@@ -76,5 +77,49 @@ TEST_F(SimpleDbFixture, test_default) |
76 | 77 | dbDatabase::destroy(db2); |
77 | 78 | } |
78 | 79 |
|
| 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 | + |
79 | 124 | } // namespace |
80 | 125 | } // namespace odb |
0 commit comments