Skip to content

Commit 3f9aadb

Browse files
committed
odb: add verbose and update tests
Signed-off-by: Peter Gadfort <[email protected]>
1 parent 785d431 commit 3f9aadb

19 files changed

+561
-37
lines changed

src/OpenRoad.tcl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -320,14 +320,14 @@ proc cpu_count { } {
320320
return [ord::cpu_count]
321321
}
322322

323-
sta::define_cmd_args "global_connect" { [-force] }
323+
sta::define_cmd_args "global_connect" { [-force] [-verbose] }
324324
proc global_connect { args } {
325325
sta::parse_key_args "global_connect" args \
326326
keys {} \
327-
flags {-force}
327+
flags {-force -verbose}
328328

329329
sta::check_argc_eq0 "add_global_connection" $args
330-
[ord::get_db_block] globalConnect [info exists flags(-force)]
330+
[ord::get_db_block] globalConnect [info exists flags(-force)] [info exists flags(-verbose)]
331331
}
332332

333333
sta::define_cmd_args "clear_global_connect" {}

src/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,14 +263,15 @@ add_global_connection -net VSS -pin_pattern {^VSSE$}
263263
The `global_connect` command is used to connect power and ground pins on design instances to the appropriate supplies.
264264

265265
```
266-
global_connect [-force]
266+
global_connect [-force] [-verbose]
267267
```
268268

269269
##### Options
270270

271271
| Switch Name | Description |
272272
| ----- | ----- |
273273
| `-force` | If specified, global connections will overwrite existing connections |
274+
| `-verbose` | If specified, report the number of connections made and skipped. |
274275

275276
#### Clear global connection rules
276277

src/gui/src/globalConnectDialog.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,9 +334,9 @@ void GlobalConnectDialog::runRule(odb::dbGlobalConnect* gc, bool force)
334334
QApplication::processEvents();
335335
int connections = 0;
336336
if (gc == nullptr) {
337-
connections = block_->globalConnect(force);
337+
connections = block_->globalConnect(force, true);
338338
} else {
339-
connections = block_->globalConnect(gc, force);
339+
connections = block_->globalConnect(gc, force, true);
340340
}
341341
QApplication::restoreOverrideCursor();
342342
emit connectionsMade(connections);

src/odb/include/odb/db.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -747,8 +747,8 @@ class dbBlock : public dbObject
747747
/// and helper functions for global connections
748748
/// on this block.
749749
///
750-
int globalConnect(bool force);
751-
int globalConnect(dbGlobalConnect* gc, bool force);
750+
int globalConnect(bool force, bool verbose);
751+
int globalConnect(dbGlobalConnect* gc, bool force, bool verbose);
752752
int addGlobalConnect(dbRegion* region,
753753
const char* instPattern,
754754
const char* pinPattern,

src/odb/src/db/dbBlock.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3347,18 +3347,18 @@ void dbBlock::destroyNetWires()
33473347
}
33483348
}
33493349

3350-
int dbBlock::globalConnect(bool force)
3350+
int dbBlock::globalConnect(bool force, bool verbose)
33513351
{
33523352
dbSet<dbGlobalConnect> gcs = getGlobalConnects();
33533353
const std::vector<dbGlobalConnect*> connects(gcs.begin(), gcs.end());
33543354
_dbBlock* dbblock = (_dbBlock*) this;
3355-
return dbblock->globalConnect(connects, force);
3355+
return dbblock->globalConnect(connects, force, verbose);
33563356
}
33573357

3358-
int dbBlock::globalConnect(dbGlobalConnect* gc, bool force)
3358+
int dbBlock::globalConnect(dbGlobalConnect* gc, bool force, bool verbose)
33593359
{
33603360
_dbBlock* dbblock = (_dbBlock*) this;
3361-
return dbblock->globalConnect({gc}, force);
3361+
return dbblock->globalConnect({gc}, force, verbose);
33623362
}
33633363

33643364
void dbBlock::clearGlobalConnect()
@@ -3419,13 +3419,14 @@ int dbBlock::addGlobalConnect(dbRegion* region,
34193419
= odb::dbGlobalConnect::create(net, region, instPattern, pinPattern);
34203420

34213421
if (gc != nullptr && do_connect) {
3422-
return globalConnect(gc, false);
3422+
return globalConnect(gc, false, false);
34233423
}
34243424
return 0;
34253425
}
34263426

34273427
int _dbBlock::globalConnect(const std::vector<dbGlobalConnect*>& connects,
3428-
bool force)
3428+
bool force,
3429+
bool verbose)
34293430
{
34303431
_dbBlock* dbblock = (_dbBlock*) this;
34313432
utl::Logger* logger = dbblock->getImpl()->getLogger();
@@ -3440,6 +3441,7 @@ int _dbBlock::globalConnect(const std::vector<dbGlobalConnect*>& connects,
34403441
std::vector<_dbGlobalConnect*> region_rules;
34413442

34423443
std::set<dbITerm*> connected_iterms;
3444+
std::set<dbITerm*> skipped_iterms;
34433445
// only search for instances once
34443446
std::map<std::string, std::vector<dbInst*>> inst_map;
34453447
std::set<dbInst*> donottouchinsts;
@@ -3473,9 +3475,8 @@ int _dbBlock::globalConnect(const std::vector<dbGlobalConnect*>& connects,
34733475

34743476
inst_map[inst_pattern] = insts;
34753477

3476-
_dbGlobalConnect* connect_rule = (_dbGlobalConnect*) connect;
34773478
for (dbInst* inst : remove_insts) {
3478-
if (connect_rule->needsModification(inst)) {
3479+
if (gc->needsModification(inst)) {
34793480
donottouchinsts.insert(inst);
34803481
}
34813482
}
@@ -3492,14 +3493,25 @@ int _dbBlock::globalConnect(const std::vector<dbGlobalConnect*>& connects,
34923493
}
34933494

34943495
for (_dbGlobalConnect* connect : non_region_rules) {
3495-
const auto connections
3496+
const auto& [connections, skipped]
34963497
= connect->connect(inst_map[connect->inst_pattern_], force);
34973498
connected_iterms.insert(connections.begin(), connections.end());
3499+
skipped_iterms.insert(skipped.begin(), skipped.end());
34983500
}
34993501
for (_dbGlobalConnect* connect : region_rules) {
3500-
const auto connections
3502+
const auto& [connections, skipped]
35013503
= connect->connect(inst_map[connect->inst_pattern_], force);
35023504
connected_iterms.insert(connections.begin(), connections.end());
3505+
skipped_iterms.insert(skipped.begin(), skipped.end());
3506+
}
3507+
3508+
if (verbose) {
3509+
logger->info(utl::ODB,
3510+
403,
3511+
"{} connections made, {} conflicts skipped{}",
3512+
connected_iterms.size(),
3513+
skipped_iterms.size(),
3514+
skipped_iterms.empty() ? "." : ", use -force to connect.");
35033515
}
35043516

35053517
return connected_iterms.size();

src/odb/src/db/dbBlock.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,9 @@ class _dbBlock : public _dbObject
163163
bool operator==(const _dbBlock& rhs) const;
164164
bool operator!=(const _dbBlock& rhs) const { return !operator==(rhs); }
165165

166-
int globalConnect(const std::vector<dbGlobalConnect*>& connects, bool force);
166+
int globalConnect(const std::vector<dbGlobalConnect*>& connects,
167+
bool force,
168+
bool verbose);
167169
_dbTech* getTech();
168170

169171
dbObjectTable* getObjectTable(dbObjectType type);

src/odb/src/db/dbGlobalConnect.cpp

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ int dbGlobalConnect::connect(dbInst* inst, bool force)
161161
return 0;
162162
}
163163

164-
const auto connections = obj->connect({inst}, force);
164+
const auto& [connections, skipped] = obj->connect({inst}, force);
165165
return connections.size();
166166
}
167167

@@ -283,25 +283,28 @@ std::set<dbMTerm*> _dbGlobalConnect::getMTermMapping(
283283
return mterms;
284284
}
285285

286-
std::set<dbITerm*> _dbGlobalConnect::connect(const std::vector<dbInst*>& insts,
287-
bool force)
286+
std::pair<std::set<dbITerm*>, std::set<dbITerm*>> _dbGlobalConnect::connect(
287+
const std::vector<dbInst*>& insts,
288+
bool force)
288289
{
289290
utl::Logger* logger = getImpl()->getLogger();
290291
dbBlock* block = (dbBlock*) getImpl()->getOwner();
291292
dbNet* net = odb::dbNet::getNet(block, net_);
292293

294+
std::set<dbITerm*> iterms;
295+
std::set<dbITerm*> iterms_skipped;
296+
293297
if (net->isDoNotTouch()) {
294298
logger->warn(
295299
utl::ODB,
296300
379,
297301
"{} is marked do not touch, will be skipped for global connections",
298302
net->getName());
299-
return {};
303+
return {iterms, iterms_skipped};
300304
}
301305

302306
const auto mterm_map = getMTermMapping();
303307

304-
std::set<dbITerm*> iterms;
305308
for (dbInst* inst : insts) {
306309
_dbInst* dbinst = (_dbInst*) inst;
307310
if (region_ != 0 && region_ != dbinst->region_) {
@@ -319,21 +322,25 @@ std::set<dbITerm*> _dbGlobalConnect::connect(const std::vector<dbInst*>& insts,
319322
auto* iterm = inst->getITerm(mterm);
320323

321324
auto* current_net = iterm->getNet();
322-
if (current_net != nullptr && !force) {
323-
// Already connected, so dont update unless force
325+
if (current_net == net) {
326+
// Already connected, nothing to do
324327
continue;
325328
}
326329
if (current_net != nullptr && current_net->isDoNotTouch()) {
327-
logger->warn(utl::ODB,
328-
380,
329-
"{}/{} is connected to {} which is marked do not touch, "
330-
"this connection will not be modified.",
331-
inst->getName(),
332-
mterm->getName(),
333-
current_net->getName());
330+
// Connected, but current net is marked do not touch, nothing to do
331+
if (force) {
332+
logger->warn(utl::ODB,
333+
380,
334+
"{} is connected to {} which is marked do not touch, "
335+
"this connection will not be modified.",
336+
iterm->getName(),
337+
current_net->getName());
338+
}
334339
continue;
335340
}
336-
if (current_net == net) {
341+
if (current_net != nullptr && !force) {
342+
// Already connected, so dont update unless force
343+
iterms_skipped.insert(iterm);
337344
continue;
338345
}
339346
iterm->connect(net);
@@ -343,7 +350,7 @@ std::set<dbITerm*> _dbGlobalConnect::connect(const std::vector<dbInst*>& insts,
343350
iterms.insert(iterm);
344351
}
345352
}
346-
return iterms;
353+
return {iterms, iterms_skipped};
347354
}
348355

349356
bool _dbGlobalConnect::appliesTo(dbInst* inst) const

src/odb/src/db/dbGlobalConnect.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ class _dbGlobalConnect : public _dbObject
5454
std::map<dbMaster*, std::set<dbMTerm*>> getMTermMapping();
5555
std::set<dbMTerm*> getMTermMapping(dbMaster* master,
5656
const std::regex& pin_regex) const;
57-
std::set<dbITerm*> connect(const std::vector<dbInst*>& insts, bool force);
57+
std::pair<std::set<dbITerm*>, std::set<dbITerm*>> connect(
58+
const std::vector<dbInst*>& insts,
59+
bool force);
5860
bool appliesTo(dbInst* inst) const;
5961
bool needsModification(dbInst* inst) const;
6062
// User Code End Methods

src/pdn/test/global_connect_with_dont_touch.tcl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ add_global_connection -net VDD -pin_pattern VDD
99
add_global_connection -net VSS -pin_pattern VSS -ground
1010

1111
set_dont_touch *
12-
global_connect
12+
13+
global_connect -force

0 commit comments

Comments
 (0)