Skip to content

Commit 5186387

Browse files
committed
grt: add CUGR global_route_debug -st visualization support
Signed-off-by: Hans Buss <hans.buss@mailfence.com>
1 parent 8f7f531 commit 5186387

File tree

9 files changed

+2208
-10
lines changed

9 files changed

+2208
-10
lines changed

src/grt/include/grt/GlobalRouter.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,12 @@ class GlobalRouter
269269
void initDebugFastRoute(std::unique_ptr<AbstractFastRouteRenderer> renderer);
270270
AbstractFastRouteRenderer* getDebugFastRoute() const;
271271

272+
void initDebugCUGR(std::unique_ptr<AbstractFastRouteRenderer> renderer);
273+
AbstractFastRouteRenderer* getDebugCUGR() const;
274+
275+
bool hasCUGR() const { return cugr_ != nullptr; }
276+
bool hasFastRoute() const { return fastroute_ != nullptr; }
277+
272278
void setDebugNet(const odb::dbNet* net);
273279
void setDebugSteinerTree(bool steinerTree);
274280
void setDebugRectilinearSTree(bool rectilinearSTree);

src/grt/src/GlobalRouter-py.i

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ using namespace grt;
1414

1515
%ignore grt::GlobalRouter::init;
1616
%ignore grt::GlobalRouter::initDebugFastRoute;
17+
%ignore grt::GlobalRouter::initDebugCUGR;
1718
%ignore grt::GlobalRouter::getDebugFastRoute;
19+
%ignore grt::GlobalRouter::getDebugCUGR;
1820
%ignore grt::GlobalRouter::setRenderer;
1921
%ignore grt::GlobalRouter::initGui;
2022

src/grt/src/GlobalRouter.cpp

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5751,33 +5751,83 @@ void GlobalRouter::initDebugFastRoute(
57515751
{
57525752
fastroute_->setDebugOn(std::move(renderer));
57535753
}
5754+
AbstractFastRouteRenderer* GlobalRouter::getDebugCUGR() const
5755+
{
5756+
if (cugr_) {
5757+
return cugr_->getDebugRenderer();
5758+
}
5759+
return nullptr;
5760+
}
5761+
5762+
void GlobalRouter::initDebugCUGR(
5763+
std::unique_ptr<AbstractFastRouteRenderer> renderer)
5764+
{
5765+
if (cugr_) {
5766+
cugr_->setDebugOn(std::move(renderer));
5767+
}
5768+
}
57545769
AbstractFastRouteRenderer* GlobalRouter::getDebugFastRoute() const
57555770
{
57565771
return fastroute_->fastrouteRender();
57575772
}
57585773
void GlobalRouter::setDebugSteinerTree(bool steinerTree)
57595774
{
5760-
fastroute_->setDebugSteinerTree(steinerTree);
5775+
if (fastroute_) {
5776+
fastroute_->setDebugSteinerTree(steinerTree);
5777+
}
5778+
if (cugr_) {
5779+
cugr_->setDebugSteinerTree(steinerTree);
5780+
}
57615781
}
5782+
57625783
void GlobalRouter::setDebugNet(const odb::dbNet* net)
57635784
{
5764-
fastroute_->setDebugNet(net);
5785+
if (fastroute_) {
5786+
fastroute_->setDebugNet(net);
5787+
}
5788+
if (cugr_) {
5789+
cugr_->setDebugNet(net);
5790+
}
57655791
}
5792+
57665793
void GlobalRouter::setDebugRectilinearSTree(bool rectilinearSTree)
57675794
{
5768-
fastroute_->setDebugRectilinearSTree(rectilinearSTree);
5795+
if (fastroute_) {
5796+
fastroute_->setDebugRectilinearSTree(rectilinearSTree);
5797+
}
5798+
if (cugr_) {
5799+
cugr_->setDebugRectilinearSTree(rectilinearSTree);
5800+
}
57695801
}
5802+
57705803
void GlobalRouter::setDebugTree2D(bool tree2D)
57715804
{
5772-
fastroute_->setDebugTree2D(tree2D);
5805+
if (fastroute_) {
5806+
fastroute_->setDebugTree2D(tree2D);
5807+
}
5808+
if (cugr_) {
5809+
cugr_->setDebugTree2D(tree2D);
5810+
}
57735811
}
5812+
57745813
void GlobalRouter::setDebugTree3D(bool tree3D)
57755814
{
5776-
fastroute_->setDebugTree3D(tree3D);
5815+
if (fastroute_) {
5816+
fastroute_->setDebugTree3D(tree3D);
5817+
}
5818+
if (cugr_) {
5819+
cugr_->setDebugTree3D(tree3D);
5820+
}
57775821
}
5822+
57785823
void GlobalRouter::setSttInputFilename(const char* file_name)
57795824
{
5780-
fastroute_->setSttInputFilename(file_name);
5825+
if (fastroute_) {
5826+
fastroute_->setSttInputFilename(file_name);
5827+
}
5828+
if (cugr_) {
5829+
cugr_->setSttInputFilename(file_name);
5830+
}
57815831
}
57825832

57835833
// For rsz::makeBufferedNetGlobalRoute so Pin/Net classes do not have to be

src/grt/src/GlobalRouter.i

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ using sta::LibertyPort;
2222

2323
%ignore grt::GlobalRouter::init;
2424
%ignore grt::GlobalRouter::initDebugFastRoute;
25+
%ignore grt::GlobalRouter::initDebugCUGR;
2526
%ignore grt::GlobalRouter::getDebugFastRoute;
27+
%ignore grt::GlobalRouter::getDebugCUGR;
2628
%ignore grt::GlobalRouter::setRenderer;
2729

2830
%import <stl.i>
@@ -232,9 +234,18 @@ void set_global_route_debug_cmd(const odb::dbNet *net,
232234
}
233235

234236
GlobalRouter* global_router = getGlobalRouter();
235-
if (global_router->getDebugFastRoute() == nullptr) {
236-
global_router->initDebugFastRoute(std::make_unique<FastRouteRenderer>(
237-
global_router->db()->getTech()));
237+
238+
if (global_router->hasFastRoute()) {
239+
if (global_router->getDebugFastRoute() == nullptr) {
240+
global_router->initDebugFastRoute(
241+
std::make_unique<FastRouteRenderer>(global_router->db()->getTech()));
242+
}
243+
}
244+
if (global_router->hasCUGR()) {
245+
if (global_router->getDebugCUGR() == nullptr) {
246+
global_router->initDebugCUGR(
247+
std::make_unique<FastRouteRenderer>(global_router->db()->getTech()));
248+
}
238249
}
239250
getGlobalRouter()->setDebugNet(net);
240251
getGlobalRouter()->setDebugSteinerTree(steinerTree);

src/grt/src/cugr/include/CUGR.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class dbNetwork;
2525

2626
namespace stt {
2727
class SteinerTreeBuilder;
28+
struct Tree;
2829
} // namespace stt
2930

3031
namespace utl {
@@ -34,11 +35,18 @@ class CallBackHandler;
3435

3536
namespace grt {
3637

38+
class AbstractFastRouteRenderer;
3739
class Design;
3840
class GridGraph;
3941
class GRNet;
4042
class BoxT;
4143

44+
struct StTree;
45+
struct FrNet;
46+
47+
// DebugSetting is defined in fastroute/include/FastRoute.h
48+
struct DebugSetting;
49+
4250
struct Constants
4351
{
4452
double weight_wire_length = 0.5;
@@ -95,6 +103,19 @@ class CUGR
95103
void updateNet(odb::dbNet* net);
96104
void routeIncremental();
97105

106+
// Debug functions
107+
void setDebugOn(std::unique_ptr<AbstractFastRouteRenderer> renderer);
108+
void setDebugNet(const odb::dbNet* net);
109+
void setDebugSteinerTree(bool steinerTree);
110+
void setDebugRectilinearSTree(bool rectilinearSTree);
111+
void setDebugTree2D(bool tree2D);
112+
void setDebugTree3D(bool tree3D);
113+
void setSttInputFilename(const char* file_name);
114+
std::string getSttInputFileName();
115+
AbstractFastRouteRenderer* getDebugRenderer() const;
116+
const odb::dbNet* getDebugNet();
117+
bool hasSaveSttInput();
118+
98119
private:
99120
float calculatePartialSlack();
100121
float getNetSlack(odb::dbNet* net);
@@ -108,6 +129,12 @@ class CUGR
108129
std::vector<std::pair<int, grt::BoxT>>& guides);
109130
void printStatistics() const;
110131

132+
void steinerTreeVisualization(const stt::Tree& stree, GRNet* net);
133+
void StTreeVisualization(const StTree& stree,
134+
GRNet* net,
135+
bool is3DVisualization);
136+
void FrNetInit(GRNet* net, FrNet* frnet);
137+
111138
std::unique_ptr<Design> design_;
112139
std::unique_ptr<GridGraph> grid_graph_;
113140
std::vector<int> net_indices_;
@@ -129,6 +156,8 @@ class CUGR
129156
float critical_nets_percentage_ = 0;
130157

131158
std::vector<int> nets_to_route_;
159+
160+
std::unique_ptr<DebugSetting> debug_;
132161
};
133162

134163
} // namespace grt

src/grt/src/cugr/src/CUGR.cpp

Lines changed: 148 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
#include "utl/CallBackHandler.h"
3737
#include "utl/Logger.h"
3838

39+
#include "../../fastroute/include/FastRoute.h"
40+
#include "../../fastroute/include/AbstractFastRouteRenderer.h"
41+
#include "../../fastroute/include/DataType.h"
42+
3943
using utl::GRT;
4044

4145
namespace grt {
@@ -49,7 +53,8 @@ CUGR::CUGR(odb::dbDatabase* db,
4953
logger_(log),
5054
callback_handler_(callback_handler),
5155
stt_builder_(stt_builder),
52-
sta_(sta)
56+
sta_(sta),
57+
debug_(std::make_unique<DebugSetting>())
5358
{
5459
}
5560

@@ -159,6 +164,14 @@ void CUGR::patternRoute(std::vector<int>& net_indices)
159164
constants_,
160165
logger_);
161166
pattern_route.constructSteinerTree();
167+
168+
GRNet* net = gr_nets_[net_index].get();
169+
if (debug_->isOn() && debug_->steinerTree && net->getDbNet() == debug_->net && pattern_route.hasSttTree()) {
170+
171+
steinerTreeVisualization(pattern_route.getSttTree(), net);
172+
173+
}
174+
162175
pattern_route.constructRoutingDAG();
163176
pattern_route.run();
164177
grid_graph_->addTreeUsage(gr_nets_[net_index]->getRoutingTree());
@@ -262,6 +275,22 @@ void CUGR::route()
262275
}
263276
}
264277

278+
if (debug_->isOn()) {
279+
const int x_corner = grid_graph_->getGridline(0, 0);
280+
const int y_corner = grid_graph_->getGridline(1, 0);
281+
int tile_size = 0;
282+
if (grid_graph_->getXSize() > 0) {
283+
tile_size = grid_graph_->getGridline(0, 1) - x_corner;
284+
}
285+
if (tile_size <= 0 && grid_graph_->getYSize() > 0) {
286+
tile_size = grid_graph_->getGridline(1, 1) - y_corner;
287+
}
288+
if (tile_size <= 0) {
289+
tile_size = std::max(1, grid_graph_->getM2Pitch());
290+
}
291+
debug_->renderer->setGridVariables(tile_size, x_corner, y_corner);
292+
}
293+
265294
patternRoute(net_indices);
266295

267296
patternRouteWithDetours(net_indices);
@@ -696,5 +725,123 @@ void CUGR::routeIncremental()
696725

697726
printStatistics();
698727
}
728+
//debug functions
729+
void CUGR::setDebugOn(std::unique_ptr<AbstractFastRouteRenderer> renderer)
730+
{
731+
debug_->renderer = std::move(renderer);
732+
}
733+
void CUGR::setDebugNet(const odb::dbNet* net)
734+
{
735+
debug_->net = net;
736+
}
737+
void CUGR::setDebugSteinerTree(bool steinerTree)
738+
{
739+
debug_->steinerTree = steinerTree;
740+
}
741+
void CUGR::setDebugRectilinearSTree(bool rectilinearSTree)
742+
{
743+
debug_->rectilinearSTree = rectilinearSTree;
744+
}
745+
void CUGR::setDebugTree2D(bool tree2D)
746+
{
747+
debug_->tree2D = tree2D;
748+
}
749+
void CUGR::setDebugTree3D(bool tree3D)
750+
{
751+
debug_->tree3D = tree3D;
752+
}
753+
void CUGR::setSttInputFilename(const char* file_name)
754+
{
755+
debug_->sttInputFileName = std::string(file_name);
756+
}
757+
758+
AbstractFastRouteRenderer* CUGR::getDebugRenderer() const
759+
{
760+
if (debug_ && debug_->renderer) {
761+
return debug_->renderer.get();
762+
}
763+
return nullptr;
764+
}
765+
std::string CUGR::getSttInputFileName()
766+
{
767+
return debug_->sttInputFileName;
768+
}
769+
const odb::dbNet* CUGR::getDebugNet()
770+
{
771+
return debug_->net;
772+
}
773+
bool CUGR::hasSaveSttInput()
774+
{
775+
return !debug_->sttInputFileName.empty();
776+
}
777+
778+
void CUGR::steinerTreeVisualization(const stt::Tree& stree, GRNet* net)
779+
{
780+
if (!debug_->isOn()) {
781+
return;
782+
}
783+
784+
// Create FrNet wrapper as renderer expects FrNet*
785+
FrNet frnet;
786+
bool is_clock = (net->getDbNet()->getSigType() == odb::dbSigType::CLOCK);
787+
788+
frnet.reset(net->getDbNet(),
789+
is_clock,
790+
0,
791+
0,
792+
constants_.min_routing_layer,
793+
grid_graph_->getNumLayers() - 1,
794+
0.0,
795+
nullptr);
796+
797+
FrNetInit(net, &frnet);
798+
799+
debug_->renderer->highlight(&frnet);
800+
debug_->renderer->setIs3DVisualization(false);
801+
debug_->renderer->setSteinerTree(stree);
802+
debug_->renderer->setTreeStructure(grt::TreeStructure::steinerTreeByStt);
803+
debug_->renderer->redrawAndPause();
804+
debug_->renderer->highlight(nullptr);
805+
806+
}
807+
808+
void CUGR::StTreeVisualization(const StTree& stree, GRNet* net, bool is3DVisualization)
809+
{
810+
if (!debug_->isOn()) {
811+
return;
812+
}
813+
814+
// Create FrNet wrapper as renderer expects FrNet*
815+
FrNet frnet;
816+
bool is_clock = (net->getDbNet()->getSigType() == odb::dbSigType::CLOCK);
817+
818+
frnet.reset(net->getDbNet(),
819+
is_clock,
820+
0,
821+
0,
822+
constants_.min_routing_layer,
823+
grid_graph_->getNumLayers() - 1,
824+
0.0,
825+
nullptr);
826+
827+
FrNetInit(net, &frnet);
828+
829+
debug_->renderer->highlight(&frnet);
830+
debug_->renderer->setIs3DVisualization(is3DVisualization);
831+
debug_->renderer->setStTreeValues(stree);
832+
debug_->renderer->setTreeStructure(grt::TreeStructure::steinerTreeByFastroute);
833+
debug_->renderer->redrawAndPause();
834+
debug_->renderer->highlight(nullptr);
835+
}
836+
837+
void CUGR::FrNetInit(GRNet* net, FrNet* frnet)
838+
{
839+
for (const auto& pin_aps : net->getPinAccessPoints()) {
840+
if (!pin_aps.empty()) {
841+
const auto& ap = pin_aps[0];
842+
frnet->addPin(ap.x(), ap.y(), ap.getLayerIdx());
843+
}
844+
}
845+
}
699846

700847
} // namespace grt

0 commit comments

Comments
 (0)