Skip to content

Commit 2fc32ff

Browse files
committed
odb: cache the x and y routing tracks grids in database
Signed-off-by: Peter Gadfort <[email protected]>
1 parent 15f5d9c commit 2fc32ff

File tree

3 files changed

+72
-42
lines changed

3 files changed

+72
-42
lines changed

src/odb/include/odb/db.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3728,11 +3728,13 @@ class dbTrackGrid : public dbObject
37283728
/// Get the "X" track coordinates for a this tech-layer.
37293729
///
37303730
void getGridX(std::vector<int>& x_grid);
3731+
const std::vector<int>& getGridX();
37313732

37323733
///
37333734
/// Get the "Y" track coordinates for a this tech-layer.
37343735
///
37353736
void getGridY(std::vector<int>& y_grid);
3737+
const std::vector<int>& getGridY();
37363738

37373739
///
37383740
/// Get the block this grid belongs too.

src/odb/src/db/dbTrackGrid.cpp

Lines changed: 66 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -83,72 +83,92 @@ dbTechLayer* dbTrackGrid::getTechLayer()
8383
return (dbTechLayer*) tech->_layer_tbl->getPtr(grid->_layer);
8484
}
8585

86-
void dbTrackGrid::getGridX(std::vector<int>& x_grid)
86+
const std::vector<int>& dbTrackGrid::getGridX()
8787
{
88-
x_grid.clear();
89-
9088
_dbTrackGrid* grid = (_dbTrackGrid*) this;
9189

92-
uint i;
90+
if (grid->grid_x_.empty()) {
91+
uint i;
9392

94-
for (i = 0; i < grid->_x_origin.size(); ++i) {
95-
int j;
93+
for (i = 0; i < grid->_x_origin.size(); ++i) {
94+
int j;
9695

97-
int x = grid->_x_origin[i];
98-
int count = grid->_x_count[i];
99-
int step = grid->_x_step[i];
96+
int x = grid->_x_origin[i];
97+
int count = grid->_x_count[i];
98+
int step = grid->_x_step[i];
10099

101-
for (j = 0; j < count; ++j) {
102-
x_grid.push_back(x);
103-
x += step;
100+
for (j = 0; j < count; ++j) {
101+
grid->grid_x_.push_back(x);
102+
x += step;
103+
}
104104
}
105-
}
106105

107-
// empty grid
108-
if (x_grid.begin() == x_grid.end()) {
109-
return;
110-
}
106+
// empty grid
107+
if (grid->grid_x_.begin() == grid->grid_x_.end()) {
108+
return grid->grid_x_;
109+
}
111110

112-
// sort coords in asscending order
113-
std::sort(x_grid.begin(), x_grid.end());
111+
// sort coords in asscending order
112+
std::sort(grid->grid_x_.begin(), grid->grid_x_.end());
114113

115-
// remove any duplicates
116-
auto new_end = std::unique(x_grid.begin(), x_grid.end());
117-
x_grid.erase(new_end, x_grid.end());
114+
// remove any duplicates
115+
auto new_end = std::unique(grid->grid_x_.begin(), grid->grid_x_.end());
116+
grid->grid_x_.erase(new_end, grid->grid_x_.end());
117+
}
118+
119+
return grid->grid_x_;
118120
}
119121

120-
void dbTrackGrid::getGridY(std::vector<int>& y_grid)
122+
void dbTrackGrid::getGridX(std::vector<int>& x_grid)
121123
{
122-
y_grid.clear();
124+
const std::vector<int>& grid = getGridX();
125+
x_grid.clear();
126+
x_grid.reserve(grid.size());
127+
x_grid.insert(x_grid.end(), grid.begin(), grid.end());
128+
}
123129

130+
const std::vector<int>& dbTrackGrid::getGridY()
131+
{
124132
_dbTrackGrid* grid = (_dbTrackGrid*) this;
125133

126-
uint i;
134+
if (grid->grid_y_.empty()) {
135+
uint i;
127136

128-
for (i = 0; i < grid->_y_origin.size(); ++i) {
129-
int j;
137+
for (i = 0; i < grid->_y_origin.size(); ++i) {
138+
int j;
130139

131-
int y = grid->_y_origin[i];
132-
int count = grid->_y_count[i];
133-
int step = grid->_y_step[i];
140+
int y = grid->_y_origin[i];
141+
int count = grid->_y_count[i];
142+
int step = grid->_y_step[i];
134143

135-
for (j = 0; j < count; ++j) {
136-
y_grid.push_back(y);
137-
y += step;
144+
for (j = 0; j < count; ++j) {
145+
grid->grid_y_.push_back(y);
146+
y += step;
147+
}
138148
}
139-
}
140149

141-
// empty grid
142-
if (y_grid.begin() == y_grid.end()) {
143-
return;
150+
// empty grid
151+
if (grid->grid_y_.begin() == grid->grid_y_.end()) {
152+
return grid->grid_y_;
153+
}
154+
155+
// sort coords in asscending order
156+
std::sort(grid->grid_y_.begin(), grid->grid_y_.end());
157+
158+
// remove any duplicates
159+
auto new_end = std::unique(grid->grid_y_.begin(), grid->grid_y_.end());
160+
grid->grid_y_.erase(new_end, grid->grid_y_.end());
144161
}
145162

146-
// sort coords in asscending order
147-
std::sort(y_grid.begin(), y_grid.end());
163+
return grid->grid_y_;
164+
}
148165

149-
// remove any duplicates
150-
auto new_end = std::unique(y_grid.begin(), y_grid.end());
151-
y_grid.erase(new_end, y_grid.end());
166+
void dbTrackGrid::getGridY(std::vector<int>& y_grid)
167+
{
168+
const std::vector<int>& grid = getGridY();
169+
y_grid.clear();
170+
y_grid.reserve(grid.size());
171+
y_grid.insert(y_grid.end(), grid.begin(), grid.end());
152172
}
153173

154174
dbBlock* dbTrackGrid::getBlock()
@@ -168,6 +188,8 @@ void dbTrackGrid::addGridPatternX(int origin_x,
168188
grid->_x_step.push_back(step);
169189
grid->_first_mask.push_back(first_mask);
170190
grid->_samemask.push_back(samemask);
191+
192+
grid->grid_x_.clear();
171193
}
172194

173195
void dbTrackGrid::addGridPatternY(int origin_y,
@@ -182,6 +204,8 @@ void dbTrackGrid::addGridPatternY(int origin_y,
182204
grid->_y_step.push_back(step);
183205
grid->_first_mask.push_back(first_mask);
184206
grid->_samemask.push_back(samemask);
207+
208+
grid->grid_y_.clear();
185209
}
186210

187211
int dbTrackGrid::getNumGridPatternsX()

src/odb/src/db/dbTrackGrid.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ class _dbTrackGrid : public _dbObject
3131
dbVector<bool> _samemask;
3232
dbId<_dbTechLayer> _next_grid;
3333

34+
// Transient
35+
std::vector<int> grid_x_;
36+
std::vector<int> grid_y_;
37+
3438
_dbTrackGrid(_dbDatabase*, const _dbTrackGrid& g);
3539
_dbTrackGrid(_dbDatabase*);
3640
~_dbTrackGrid();

0 commit comments

Comments
 (0)