Skip to content

Commit aad80f0

Browse files
committed
Added -buffer_cell support for buffer_ports command.
e.g., "buffer_ports -buffer_cell <lib_cell>"
1 parent 9cec79a commit aad80f0

19 files changed

Lines changed: 317 additions & 21 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
*.orig
1212
*.vscode
1313
*.sw[opqr]
14+
*.code-workspace
1415
TAGS
1516
*~
1617
\#*#

src/rsz/include/rsz/Resizer.hh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,8 @@ class Resizer : public dbStaState, public dbNetworkObserver
259259
// Remove all or selected buffers from the netlist.
260260
void removeBuffers(InstanceSeq insts);
261261
void unbufferNet(Net* net);
262-
void bufferInputs();
263-
void bufferOutputs();
262+
void bufferInputs(LibertyCell* buffer_cell = nullptr);
263+
void bufferOutputs(LibertyCell* buffer_cell = nullptr);
264264

265265
// from sta::dbNetworkObserver callbacks
266266
void postReadLiberty() override;
@@ -457,6 +457,7 @@ class Resizer : public dbStaState, public dbNetworkObserver
457457
float max_drive_resist);
458458
void findBuffers();
459459
void findFastBuffers();
460+
LibertyCell* findLowestDriveBuffer(LibertyCell* buffer_cell = nullptr);
460461
bool isLinkCell(LibertyCell* cell) const;
461462
void findTargetLoads();
462463
void balanceBin(const std::vector<odb::dbInst*>& bin,

src/rsz/src/Resizer.cc

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -746,17 +746,47 @@ void Resizer::findBuffers()
746746
}
747747
}
748748

749+
LibertyCell* Resizer::findLowestDriveBuffer(LibertyCell* buffer_cell)
750+
{
751+
// Prefer user-specified buffer cell if provided.
752+
if (buffer_cell) {
753+
logger_->info(RSZ, 31, "Using the given buffer: {}", buffer_cell->name());
754+
return buffer_cell;
755+
}
756+
757+
// Otherwise, find the weakest buffer with the lowest drive resistance.
758+
findBuffers(); // updates buffer_lowest_drive_
759+
760+
// No buffer?
761+
if (buffer_lowest_drive_ == nullptr) {
762+
logger_->error(RSZ, 23, "No buffers found.");
763+
return nullptr;
764+
}
765+
766+
logger_->info(
767+
RSZ, 52,
768+
"Using the buffer with the lowest driving resistance: {}",
769+
buffer_lowest_drive_->name());
770+
return buffer_lowest_drive_;
771+
}
772+
749773
bool Resizer::isLinkCell(LibertyCell* cell) const
750774
{
751775
return network_->findLibertyCell(cell->name()) == cell;
752776
}
753777

754778
////////////////////////////////////////////////////////////////
755779

756-
void Resizer::bufferInputs()
780+
void Resizer::bufferInputs(LibertyCell* buffer_cell)
757781
{
758782
init();
759-
findBuffers();
783+
784+
// find the buffer to use
785+
LibertyCell* buffer_to_use = findLowestDriveBuffer(buffer_cell);
786+
if (buffer_to_use == nullptr) {
787+
return;
788+
}
789+
760790
sta_->ensureClkNetwork();
761791
inserted_buffer_count_ = 0;
762792
buffer_moved_into_core_ = false;
@@ -776,14 +806,14 @@ void Resizer::bufferInputs()
776806
// Hands off special nets.
777807
&& !db_network_->isSpecial(net) && hasPins(net)) {
778808
// repair_design will resize to target slew.
779-
bufferInput(pin, buffer_lowest_drive_);
809+
bufferInput(pin, buffer_to_use);
780810
}
781811
}
782812
}
783813

814+
logger_->info(
815+
RSZ, 27, "Inserted {} input buffers.", inserted_buffer_count_);
784816
if (inserted_buffer_count_ > 0) {
785-
logger_->info(
786-
RSZ, 27, "Inserted {} input buffers.", inserted_buffer_count_);
787817
level_drvr_vertices_valid_ = false;
788818
}
789819
}
@@ -972,10 +1002,16 @@ Instance* Resizer::bufferInput(const Pin* top_pin, LibertyCell* buffer_cell)
9721002
return buffer;
9731003
}
9741004

975-
void Resizer::bufferOutputs()
1005+
void Resizer::bufferOutputs(LibertyCell* buffer_cell)
9761006
{
9771007
init();
978-
findBuffers();
1008+
1009+
// find the buffer to use
1010+
LibertyCell* buffer_to_use = findLowestDriveBuffer(buffer_cell);
1011+
if (buffer_to_use == nullptr) {
1012+
return;
1013+
}
1014+
9791015
inserted_buffer_count_ = 0;
9801016
buffer_moved_into_core_ = false;
9811017

@@ -995,14 +1031,14 @@ void Resizer::bufferOutputs()
9951031
// drivers.
9961032
&& !hasTristateOrDontTouchDriver(net) && !vertex->isConstant()
9971033
&& hasPins(net)) {
998-
bufferOutput(pin, buffer_lowest_drive_);
1034+
bufferOutput(pin, buffer_to_use);
9991035
}
10001036
}
10011037
}
10021038

1039+
logger_->info(
1040+
RSZ, 28, "Inserted {} output buffers.", inserted_buffer_count_);
10031041
if (inserted_buffer_count_ > 0) {
1004-
logger_->info(
1005-
RSZ, 28, "Inserted {} output buffers.", inserted_buffer_count_);
10061042
level_drvr_vertices_valid_ = false;
10071043
}
10081044
}
@@ -1056,6 +1092,7 @@ void Resizer::bufferOutput(const Pin* top_pin, LibertyCell* buffer_cell)
10561092
sta_->disconnectPin(const_cast<Pin*>(top_pin));
10571093

10581094
LibertyPort *input, *output;
1095+
assert(buffer_cell);
10591096
buffer_cell->bufferPorts(input, output);
10601097

10611098
string buffer_name = makeUniqueInstName("output");

src/rsz/src/Resizer.i

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -409,19 +409,19 @@ set_dont_touch_net(Net *net,
409409
}
410410

411411
void
412-
buffer_inputs()
412+
buffer_inputs(LibertyCell *buffer_cell)
413413
{
414414
ensureLinked();
415415
Resizer *resizer = getResizer();
416-
resizer->bufferInputs();
416+
resizer->bufferInputs(buffer_cell);
417417
}
418418

419419
void
420-
buffer_outputs()
420+
buffer_outputs(LibertyCell *buffer_cell)
421421
{
422422
ensureLinked();
423423
Resizer *resizer = getResizer();
424-
resizer->bufferOutputs();
424+
resizer->bufferOutputs(buffer_cell);
425425
}
426426

427427
void

src/rsz/src/Resizer.tcl

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,36 @@ proc get_db_tech_checked { } {
99
}
1010
return $tech
1111
}
12+
13+
proc parse_buffer_cell { keys_var required } {
14+
upvar 1 $keys_var keys
15+
set buffer_cell "NULL"
16+
17+
if { [info exists keys(-buffer_cell)] } {
18+
set buffer_cell_name $keys(-buffer_cell)
19+
if { $buffer_cell_name ne "" } {
20+
set buffer_cell [sta::get_lib_cell_error "-buffer_cell" $buffer_cell_name]
21+
22+
# the lib cell is a buffer?
23+
if { $buffer_cell ne "NULL" && ![get_property $buffer_cell is_buffer] } {
24+
utl::error RSZ 211 "[get_name $buffer_cell] is not a buffer."
25+
}
26+
}
27+
}
28+
29+
# required argument is missing?
30+
if { $buffer_cell == "NULL" && $required } {
31+
utl::error RSZ 212 "-buffer_cell is required for buffer insertion."
32+
}
33+
34+
return $buffer_cell
35+
}
36+
37+
# namespace eval rsz
1238
}
1339

40+
41+
1442
# Units are from OpenSTA (ie Liberty file or set_cmd_units).
1543
sta::define_cmd_args "set_layer_rc" { [-layer layer]\
1644
[-via via_layer]\
@@ -441,8 +469,8 @@ proc report_dont_touch { args } {
441469
}
442470

443471
sta::define_cmd_args "buffer_ports" {[-inputs] [-outputs]\
444-
[-max_utilization util]\
445-
[-buffer_cell buf_cell]}
472+
[-max_utilization util]\
473+
[-buffer_cell buf_cell]}
446474

447475
proc buffer_ports { args } {
448476
sta::parse_key_args "buffer_ports" args \
@@ -455,14 +483,17 @@ proc buffer_ports { args } {
455483
set buffer_inputs 1
456484
set buffer_outputs 1
457485
}
486+
458487
sta::check_argc_eq0 "buffer_ports" $args
459488

460489
rsz::set_max_utilization [rsz::parse_max_util keys]
490+
set buffer_cell [rsz::parse_buffer_cell keys 0] ; # 0: optional argument
491+
461492
if { $buffer_inputs } {
462-
rsz::buffer_inputs
493+
rsz::buffer_inputs $buffer_cell
463494
}
464495
if { $buffer_outputs } {
465-
rsz::buffer_outputs
496+
rsz::buffer_outputs $buffer_cell
466497
}
467498
}
468499

@@ -1056,7 +1087,7 @@ proc replace_arith_modules { args } {
10561087
if { [info exists keys(-target)] } {
10571088
set target $keys(-target)
10581089
if { [lsearch -exact {setup hold power area} $target] == -1 } {
1059-
util::error "RSZ" 164 "-target needs to be one of setup, hold, power, area"
1090+
utl::error "RSZ" 164 "-target needs to be one of setup, hold, power, area"
10601091
}
10611092
} else {
10621093
set target "setup"

src/rsz/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ or_integration_tests(
1212
buffer_ports6
1313
buffer_ports7
1414
buffer_ports8
15+
buffer_ports9
1516
buffer_varying_lengths
1617
clone_flat
1718
clone_hier

src/rsz/test/buffer_ports1.ok

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
[INFO ODB-0131] Created 5 components and 27 component-terminals.
55
[INFO ODB-0132] Created 2 special nets and 10 connections.
66
[INFO ODB-0133] Created 12 nets and 14 connections.
7+
[INFO RSZ-0052] Using the buffer with the lowest driving resistance: BUF_X1
78
[INFO RSZ-0027] Inserted 2 input buffers.
9+
[INFO RSZ-0052] Using the buffer with the lowest driving resistance: BUF_X1
810
[INFO RSZ-0028] Inserted 1 output buffers.
911
No differences found.

src/rsz/test/buffer_ports3.ok

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@
44
[INFO ODB-0130] Created 8 pins.
55
[INFO ODB-0131] Created 1 components and 10 component-terminals.
66
[INFO ODB-0133] Created 8 nets and 8 connections.
7+
[INFO RSZ-0052] Using the buffer with the lowest driving resistance: BUF_X1
8+
[INFO RSZ-0027] Inserted 0 input buffers.
9+
[INFO RSZ-0052] Using the buffer with the lowest driving resistance: BUF_X1
710
[INFO RSZ-0028] Inserted 4 output buffers.

src/rsz/test/buffer_ports4.ok

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
[INFO ODB-0131] Created 250 components and 2000 component-terminals.
55
[INFO ODB-0132] Created 2 special nets and 500 connections.
66
[INFO ODB-0133] Created 2 nets and 500 connections.
7+
[INFO RSZ-0052] Using the buffer with the lowest driving resistance: BUF_X1
78
[INFO RSZ-0027] Inserted 1 input buffers.
89
max slew
910

src/rsz/test/buffer_ports5.ok

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@
44
[INFO ODB-0131] Created 5 components and 27 component-terminals.
55
[INFO ODB-0132] Created 2 special nets and 10 connections.
66
[INFO ODB-0133] Created 10 nets and 14 connections.
7+
[INFO RSZ-0052] Using the buffer with the lowest driving resistance: BUF_X1
78
[INFO RSZ-0027] Inserted 2 input buffers.
9+
[INFO RSZ-0052] Using the buffer with the lowest driving resistance: BUF_X1
810
[INFO RSZ-0028] Inserted 1 output buffers.

0 commit comments

Comments
 (0)