Skip to content

Commit b5fa72e

Browse files
committed
rsz: add some gui debugging for repair_design
Draw the Steiner tree and the elements being added along it. Signed-off-by: Matt Liberty <[email protected]>
1 parent 5dd69b9 commit b5fa72e

File tree

5 files changed

+102
-1
lines changed

5 files changed

+102
-1
lines changed

src/rsz/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ cc_library(
7777
cc_library(
7878
name = "ui",
7979
srcs = [
80+
"src/BufferedNet.hh",
8081
"src/Graphics.cc",
8182
"src/Graphics.hh",
8283
"src/MakeResizer.cc",

src/rsz/src/Graphics.cc

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,79 @@ void Graphics::subdivideDone()
5454
}
5555
}
5656

57+
void Graphics::repairNetStart(const BufferedNetPtr& bnet, odb::dbNet* net)
58+
{
59+
lines_.clear();
60+
if (net_) {
61+
repair_net_ignore_ = (net != net_);
62+
}
63+
if (!repair_net_ignore_) {
64+
bnet_ = bnet;
65+
gui::Gui::get()->redraw();
66+
gui::Gui::get()->pause();
67+
}
68+
}
69+
70+
void Graphics::makeBuffer(odb::dbInst* inst)
71+
{
72+
if (!repair_net_ignore_) {
73+
buffers_.push_back(inst);
74+
gui::Gui::get()->redraw();
75+
gui::Gui::get()->pause();
76+
}
77+
}
78+
79+
void Graphics::repairNetDone()
80+
{
81+
if (!repair_net_ignore_) {
82+
gui::Gui::get()->redraw();
83+
gui::Gui::get()->pause();
84+
}
85+
bnet_.reset();
86+
buffers_.clear();
87+
}
88+
89+
void Graphics::drawBNet(const BufferedNetPtr& bnet, gui::Painter& painter)
90+
{
91+
switch (bnet->type()) {
92+
case BufferedNetType::wire: {
93+
painter.drawLine(bnet->location(), bnet->ref()->location());
94+
drawBNet(bnet->ref(), painter);
95+
break;
96+
}
97+
case BufferedNetType::junction:
98+
painter.drawLine(bnet->location(), bnet->ref()->location());
99+
painter.drawLine(bnet->location(), bnet->ref2()->location());
100+
drawBNet(bnet->ref(), painter);
101+
drawBNet(bnet->ref2(), painter);
102+
break;
103+
case BufferedNetType::load: {
104+
Point loc = bnet->location();
105+
painter.drawCircle(loc.x(), loc.y(), 1000);
106+
break;
107+
}
108+
case BufferedNetType::buffer:
109+
painter.drawLine(bnet->location(), bnet->ref()->location());
110+
drawBNet(bnet->ref(), painter);
111+
break;
112+
}
113+
}
114+
57115
void Graphics::drawObjects(gui::Painter& painter)
58116
{
59117
painter.setPen(gui::Painter::kRed, true);
60118
for (const odb::Line& line : lines_) {
61119
painter.drawLine(line.pt0(), line.pt1());
62120
}
121+
122+
if (bnet_) {
123+
painter.setPenAndBrush(gui::Painter::kPink, true);
124+
drawBNet(bnet_, painter);
125+
painter.setPenAndBrush(gui::Painter::kGreen, true);
126+
for (odb::dbInst* buffer : buffers_) {
127+
painter.drawRect(buffer->getBBox()->getBox());
128+
}
129+
}
63130
}
64131

65132
} // namespace rsz

src/rsz/src/Graphics.hh

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,23 @@ class Graphics : public gui::Renderer, public ResizerObserver
2020
void subdivide(const odb::Line& line) override;
2121
void subdivideDone() override;
2222

23+
void repairNetStart(const BufferedNetPtr& bnet, odb::dbNet* net) override;
24+
void makeBuffer(odb::dbInst* inst) override;
25+
void repairNetDone() override;
26+
2327
// Renderer
2428
void drawObjects(gui::Painter& painter) override;
2529

2630
private:
31+
void drawBNet(const BufferedNetPtr& bnet, gui::Painter& painter);
32+
33+
BufferedNetPtr bnet_;
34+
std::vector<odb::dbInst*> buffers_;
2735
odb::dbNet* net_{nullptr};
2836
std::vector<odb::Line> lines_;
29-
// Ingore this net if true
37+
// Ignore this net if true
3038
bool subdivide_ignore_{false};
39+
bool repair_net_ignore_{false};
3140
// stop at each step?
3241
bool stop_on_subdivide_step_{false};
3342
};

src/rsz/src/RepairDesign.cc

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,10 @@ bool RepairDesign::performGainBuffering(Net* net,
777777

778778
repaired_net = true;
779779
inserted_buffer_count_++;
780+
if (graphics_) {
781+
dbInst* db_inst = db_network_->staToDb(inst);
782+
graphics_->makeBuffer(db_inst);
783+
}
780784

781785
int max_level = 0;
782786
for (auto it = sinks.begin(); it != group_end; it++) {
@@ -1226,9 +1230,19 @@ void RepairDesign::repairNet(const BufferedNetPtr& bnet,
12261230
max_length_ = max_length;
12271231
corner_ = corner;
12281232

1233+
if (graphics_) {
1234+
Net* net = db_network_->net(drvr_pin);
1235+
odb::dbNet* db_net = db_network_->staToDb(net);
1236+
graphics_->repairNetStart(bnet, db_net);
1237+
}
1238+
12291239
int wire_length;
12301240
PinSeq load_pins;
12311241
repairNet(bnet, 0, wire_length, load_pins);
1242+
1243+
if (graphics_) {
1244+
graphics_->repairNetDone();
1245+
}
12321246
}
12331247

12341248
void RepairDesign::repairNet(const BufferedNetPtr& bnet,
@@ -2575,6 +2589,11 @@ bool RepairDesign::makeRepeater(
25752589
}
25762590
}
25772591

2592+
if (graphics_) {
2593+
dbInst* db_inst = db_network_->staToDb(buffer);
2594+
graphics_->makeBuffer(db_inst);
2595+
}
2596+
25782597
// Resize repeater as we back up by levels.
25792598
if (resize) {
25802599
Pin* buffer_out_pin = network_->findPin(buffer, buffer_output_port);

src/rsz/src/ResizerObserver.hh

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

44
#pragma once
55

6+
#include "BufferedNet.hh"
67
#include "odb/db.h"
78
#include "odb/geom.h"
89

@@ -19,6 +20,10 @@ class ResizerObserver
1920
virtual void subdivideStart(odb::dbNet* net) {}
2021
virtual void subdivide(const odb::Line& line) {}
2122
virtual void subdivideDone() {}
23+
24+
virtual void repairNetStart(const BufferedNetPtr& bnet, odb::dbNet* net) {}
25+
virtual void makeBuffer(odb::dbInst* inst) {}
26+
virtual void repairNetDone() {}
2227
};
2328

2429
} // namespace rsz

0 commit comments

Comments
 (0)