Skip to content

Commit 3536fae

Browse files
authored
Merge pull request #8854 from gadfort/odb-cache-grids
odb: cache x/y grids in `dbTrackGrid`
2 parents 234e9cc + f9e1079 commit 3536fae

File tree

6 files changed

+82
-57
lines changed

6 files changed

+82
-57
lines changed

src/gui/src/renderThread.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,6 @@ void RenderThread::drawTracks(dbTechLayer* layer,
325325
painter->setBrush(Qt::NoBrush);
326326

327327
bool is_horizontal = layer->getDirection() == dbTechLayerDir::HORIZONTAL;
328-
std::vector<int> grids;
329328
if ((!is_horizontal && viewer_->options_->arePrefTracksVisible())
330329
|| (is_horizontal && viewer_->options_->areNonPrefTracksVisible())) {
331330
bool show_grid = true;
@@ -336,8 +335,7 @@ void RenderThread::drawTracks(dbTechLayer* layer,
336335
}
337336

338337
if (show_grid) {
339-
grid->getGridX(grids);
340-
for (int x : grids) {
338+
for (int x : grid->getGridX()) {
341339
if (restart_) {
342340
break;
343341
}
@@ -362,8 +360,7 @@ void RenderThread::drawTracks(dbTechLayer* layer,
362360
}
363361

364362
if (show_grid) {
365-
grid->getGridY(grids);
366-
for (int y : grids) {
363+
for (int y : grid->getGridY()) {
367364
if (restart_) {
368365
break;
369366
}

src/odb/include/odb/db.h

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

37493750
///
37503751
/// Get the "Y" track coordinates for a this tech-layer.
37513752
///
37523753
void getGridY(std::vector<int>& y_grid);
3754+
const std::vector<int>& getGridY();
37533755

37543756
///
37553757
/// Get the block this grid belongs too.

src/odb/src/db/dbTrackGrid.cpp

Lines changed: 67 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "odb/db.h"
2020
#include "odb/dbSet.h"
2121
#include "odb/dbTypes.h"
22+
#include "odb/odb.h"
2223
#include "utl/Logger.h"
2324

2425
namespace odb {
@@ -83,72 +84,92 @@ dbTechLayer* dbTrackGrid::getTechLayer()
8384
return (dbTechLayer*) tech->_layer_tbl->getPtr(grid->_layer);
8485
}
8586

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

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

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

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

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

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

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

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());
115+
// remove any duplicates
116+
auto new_end = std::unique(grid->grid_x_.begin(), grid->grid_x_.end());
117+
grid->grid_x_.erase(new_end, grid->grid_x_.end());
118+
}
119+
120+
return grid->grid_x_;
118121
}
119122

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

131+
const std::vector<int>& dbTrackGrid::getGridY()
132+
{
124133
_dbTrackGrid* grid = (_dbTrackGrid*) this;
125134

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

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

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

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

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

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

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());
167+
void dbTrackGrid::getGridY(std::vector<int>& y_grid)
168+
{
169+
const std::vector<int>& grid = getGridY();
170+
y_grid.clear();
171+
y_grid.reserve(grid.size());
172+
y_grid.insert(y_grid.end(), grid.begin(), grid.end());
152173
}
153174

154175
dbBlock* dbTrackGrid::getBlock()
@@ -168,6 +189,8 @@ void dbTrackGrid::addGridPatternX(int origin_x,
168189
grid->_x_step.push_back(step);
169190
grid->_first_mask.push_back(first_mask);
170191
grid->_samemask.push_back(samemask);
192+
193+
grid->grid_x_.clear();
171194
}
172195

173196
void dbTrackGrid::addGridPatternY(int origin_y,
@@ -182,6 +205,8 @@ void dbTrackGrid::addGridPatternY(int origin_y,
182205
grid->_y_step.push_back(step);
183206
grid->_first_mask.push_back(first_mask);
184207
grid->_samemask.push_back(samemask);
208+
209+
grid->grid_y_.clear();
185210
}
186211

187212
int dbTrackGrid::getNumGridPatternsX()

src/odb/src/db/dbTrackGrid.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
#pragma once
55

6+
#include <vector>
7+
68
#include "dbCore.h"
79
#include "dbDatabase.h"
810
#include "dbVector.h"
@@ -31,6 +33,10 @@ class _dbTrackGrid : public _dbObject
3133
dbVector<bool> _samemask;
3234
dbId<_dbTechLayer> _next_grid;
3335

36+
// Transient
37+
std::vector<int> grid_x_;
38+
std::vector<int> grid_y_;
39+
3440
_dbTrackGrid(_dbDatabase*, const _dbTrackGrid& g);
3541
_dbTrackGrid(_dbDatabase*);
3642
~_dbTrackGrid();

src/pad/src/RDLRouter.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,18 +1206,13 @@ void RDLRouter::makeGraph()
12061206

12071207
graph_weight_ = boost::get(boost::edge_weight, graph_);
12081208

1209-
std::vector<int> x_grid;
1210-
std::vector<int> y_grid;
1211-
12121209
odb::dbTrackGrid* tracks = block_->findTrackGrid(layer_);
1213-
tracks->getGridX(x_grid);
1214-
tracks->getGridY(y_grid);
12151210

12161211
// filter grid points based on spacing requirements
12171212
const int pitch = width_ + spacing_ - 1;
12181213
const int start = width_ / 2 + 1;
12191214
x_grid_.clear();
1220-
for (const auto& x : x_grid) {
1215+
for (const auto& x : tracks->getGridX()) {
12211216
bool add = false;
12221217
if (x_grid_.empty()) {
12231218
if (x >= start) {
@@ -1234,7 +1229,7 @@ void RDLRouter::makeGraph()
12341229
}
12351230
}
12361231
y_grid_.clear();
1237-
for (const auto& y : y_grid) {
1232+
for (const auto& y : tracks->getGridY()) {
12381233
bool add = false;
12391234
if (y_grid_.empty()) {
12401235
if (y >= start) {

src/pdn/src/techlayer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ void TechLayer::populateGrid(odb::dbBlock* block, odb::dbTechLayerDir dir)
4747

4848
auto* tracks = block->findTrackGrid(layer_);
4949
if (dir == odb::dbTechLayerDir::HORIZONTAL) {
50-
tracks->getGridY(grid_);
50+
grid_ = tracks->getGridY();
5151
} else if (dir == odb::dbTechLayerDir::VERTICAL) {
52-
tracks->getGridX(grid_);
52+
grid_ = tracks->getGridX();
5353
} else {
54-
tracks->getGridY(grid_);
54+
grid_ = tracks->getGridY();
5555
}
5656
}
5757

0 commit comments

Comments
 (0)