Skip to content

Commit 5951c01

Browse files
committed
Fixed DbInstanceNetIterator to iterate both flat and hierarchical nets within the given instance.
- Moved dbSta/test/get_ports2* test cases to rsz/test/buffer_ports11* test cases. Signed-off-by: Jaehyun Kim <[email protected]>
1 parent 80bd842 commit 5951c01

29 files changed

+1287
-21
lines changed

src/cts/test/hier_insertion_delay.vok

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,43 @@
11
module multi_sink (clk);
22
input clk;
33

4+
wire clknet_leaf_15_clk_regs;
5+
wire clknet_leaf_13_clk_regs;
6+
wire clknet_leaf_12_clk_regs;
7+
wire clknet_leaf_11_clk_regs;
8+
wire clk_regs;
9+
wire clknet_0_clk;
10+
wire clknet_1_0__leaf_clk;
11+
wire clknet_leaf_0_clk_regs;
12+
wire clknet_leaf_1_clk_regs;
13+
wire clknet_leaf_2_clk_regs;
14+
wire clknet_leaf_3_clk_regs;
15+
wire clknet_leaf_4_clk_regs;
16+
wire clknet_leaf_5_clk_regs;
17+
wire clknet_leaf_6_clk_regs;
18+
wire clknet_leaf_7_clk_regs;
19+
wire clknet_leaf_8_clk_regs;
20+
wire clknet_leaf_9_clk_regs;
21+
wire clknet_leaf_10_clk_regs;
22+
wire clknet_leaf_14_clk_regs;
23+
wire clknet_leaf_16_clk_regs;
24+
wire clknet_leaf_17_clk_regs;
25+
wire clknet_leaf_18_clk_regs;
26+
wire clknet_leaf_19_clk_regs;
27+
wire clknet_leaf_20_clk_regs;
28+
wire clknet_leaf_21_clk_regs;
29+
wire clknet_leaf_22_clk_regs;
30+
wire clknet_leaf_23_clk_regs;
31+
wire clknet_leaf_24_clk_regs;
32+
wire clknet_leaf_25_clk_regs;
33+
wire clknet_leaf_26_clk_regs;
34+
wire clknet_leaf_27_clk_regs;
35+
wire clknet_0_clk_regs;
36+
wire clknet_1_0__leaf_clk_regs;
37+
wire clknet_1_1__leaf_clk_regs;
38+
wire delaynet_0_core;
39+
wire delaynet_1_core;
40+
wire delaynet_2_core;
441

542
CLKBUF_X3 delaybuf_2_core (.A(delaynet_2_core),
643
.Z(clknet_0_clk));

src/cts/test/simple_test_hier_out.vok

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
module test_16_sinks (clk);
22
input clk;
33

4+
wire clknet_1_1__leaf_clk;
5+
wire clknet_1_0__leaf_clk;
6+
wire clknet_0_clk;
47

58
INV_X1 clkload0 (.A(clknet_1_1__leaf_clk));
69
CLKBUF_X3 clkbuf_1_1__f_clk (.A(clknet_0_clk),

src/dbSta/src/dbNetwork.cc

Lines changed: 80 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -312,23 +312,81 @@ class DbInstanceNetIterator : public InstanceNetIterator
312312
dbSet<dbNet>::iterator end_;
313313
dbSet<dbModNet>::iterator mod_net_iter_;
314314
dbSet<dbModNet>::iterator mod_net_end_;
315+
std::vector<dbNet*> flat_nets_vec_;
316+
size_t flat_net_idx_ = 0;
315317
};
316318

317319
DbInstanceNetIterator::DbInstanceNetIterator(const Instance* instance,
318320
const dbNetwork* network)
319321
: network_(network)
320322
{
321323
if (network_->hasHierarchy()) {
322-
dbInst* db_inst;
323-
dbModInst* mod_inst;
324-
network_->staToDb(instance, db_inst, mod_inst);
325-
if (mod_inst) {
326-
dbModule* master = mod_inst->getMaster();
327-
dbSet<dbModNet> nets = master->getModNets();
328-
mod_net_iter_ = nets.begin();
329-
mod_net_end_ = nets.end();
324+
//
325+
// In hierarchical flow, the net iterator collects both hierarchical
326+
// nets (dbModNets) and unique flat nets (dbNets) within the
327+
// instance's module scope.
328+
// Flat nets can be retrieved by traversing instance ITerms and BTerms.
329+
// Avoids the duplication b/w flat and hierarchical nets.
330+
//
331+
332+
// Get the module of the instance
333+
dbModule* module = nullptr;
334+
if (instance == network->topInstance()) {
335+
module = network->block()->getTopModule();
336+
} else {
337+
dbInst* db_inst;
338+
dbModInst* mod_inst;
339+
network_->staToDb(instance, db_inst, mod_inst);
340+
if (mod_inst) {
341+
module = mod_inst->getMaster();
342+
}
343+
}
344+
345+
if (module) {
346+
// Get dbModNets
347+
dbSet<dbModNet> mod_nets = module->getModNets();
348+
mod_net_iter_ = mod_nets.begin();
349+
mod_net_end_ = mod_nets.end();
350+
351+
// Keep track of flat nets that are already represented by a mod_net
352+
// to avoid returning both.
353+
std::set<dbNet*> handled_flat_nets;
354+
for (dbModNet* mod_net : mod_nets) {
355+
dbNet* flat_net = network_->findRelatedDbNet(mod_net);
356+
if (flat_net) {
357+
handled_flat_nets.insert(flat_net);
358+
}
359+
}
360+
361+
// Collect dbNets from children dbInsts' pins that are not already
362+
// handled.
363+
std::set<dbNet*> flat_nets_set;
364+
for (dbInst* child_inst : module->getInsts()) {
365+
for (dbITerm* iterm : child_inst->getITerms()) {
366+
dbNet* flat_net = iterm->getNet();
367+
if (flat_net
368+
&& handled_flat_nets.find(flat_net) == handled_flat_nets.end()) {
369+
flat_nets_set.insert(flat_net);
370+
}
371+
}
372+
}
373+
374+
// For top instance, also check top-level ports (BTerms)
375+
if (instance == network->topInstance()) {
376+
for (dbBTerm* bterm : network->block()->getBTerms()) {
377+
dbNet* flat_net = bterm->getNet();
378+
if (flat_net
379+
&& handled_flat_nets.find(flat_net) == handled_flat_nets.end()) {
380+
flat_nets_set.insert(flat_net);
381+
}
382+
}
383+
}
384+
flat_nets_vec_.assign(flat_nets_set.begin(), flat_nets_set.end());
330385
}
331386
} else {
387+
//
388+
// In flat flow, the net iterator collects all nets from top block
389+
//
332390
if (instance == network->topInstance()) {
333391
dbSet<dbNet> nets = network->block()->getNets();
334392
iter_ = nets.begin();
@@ -340,17 +398,27 @@ DbInstanceNetIterator::DbInstanceNetIterator(const Instance* instance,
340398
bool DbInstanceNetIterator::hasNext()
341399
{
342400
if (network_->hasHierarchy()) {
343-
return mod_net_iter_ != mod_net_end_;
401+
if (mod_net_iter_ != mod_net_end_) {
402+
return true;
403+
}
404+
return flat_net_idx_ < flat_nets_vec_.size();
344405
}
345406
return iter_ != end_;
346407
}
347408

348409
Net* DbInstanceNetIterator::next()
349410
{
350411
if (network_->hasHierarchy()) {
351-
dbModNet* net = *mod_net_iter_;
352-
mod_net_iter_++;
353-
return network_->dbToSta(net);
412+
if (mod_net_iter_ != mod_net_end_) {
413+
dbModNet* net = *mod_net_iter_;
414+
mod_net_iter_++;
415+
return network_->dbToSta(net);
416+
}
417+
if (flat_net_idx_ < flat_nets_vec_.size()) {
418+
dbNet* net = flat_nets_vec_[flat_net_idx_++];
419+
return network_->dbToSta(net);
420+
}
421+
return nullptr;
354422
}
355423
dbNet* net = *iter_;
356424
iter_++;

src/dbSta/test/BUILD

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ COMPULSORY_TESTS = [
1212
"find_clks2",
1313
"get_ports1",
1414
"get_ports1_hier",
15-
"get_ports2",
16-
"get_ports2_hier",
1715
"hier2",
1816
"hierclock",
1917
"hierwrite",
@@ -116,7 +114,6 @@ filegroup(
116114
"example1_slow.lib",
117115
"example1_typ.lib",
118116
"get_ports1.v",
119-
"get_ports2.v",
120117
"helpers.tcl",
121118
"hier1.def",
122119
"hier1.sdc",

src/dbSta/test/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ or_integration_tests(
99
find_clks2
1010
get_ports1
1111
get_ports1_hier
12-
get_ports2
13-
get_ports2_hier
1412
hier2
1513
hierclock
1614
hierwrite

src/dbSta/test/hier2_out.vok

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module top (a,
55
input b;
66
output out;
77

8+
wire a_int;
89

910
INV_X1 _4_ (.ZN(a_int),
1011
.A(a));

src/dbSta/test/hierclock_out.vok

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ module hierclock (a_count_valid_o,
1919
output [3:0] b_count_o;
2020
input [3:0] b_i;
2121

22+
wire clk2_int;
23+
wire clk1_int;
2224

2325
clockgen U1 (.clk_i(clk_i),
2426
.rst_n_i(rst_n_i),
@@ -58,6 +60,19 @@ module clockgen (clk_i,
5860
output clk1_o;
5961
output clk2_o;
6062

63+
wire _03_;
64+
wire _04_;
65+
wire _05_;
66+
wire _06_;
67+
wire _11_;
68+
wire _12_;
69+
wire _13_;
70+
wire _14_;
71+
wire _15_;
72+
wire _19_;
73+
wire _20_;
74+
wire _21_;
75+
wire _22_;
6176
wire [3:0] counter_q;
6277

6378
INV_X1 _28_ (.A(rst_n_i),
@@ -124,6 +139,27 @@ module counter (clk_i,
124139
output count_valid_o;
125140

126141
wire count_valid_q;
142+
wire _12_;
143+
wire _13_;
144+
wire _14_;
145+
wire _15_;
146+
wire _16_;
147+
wire _26_;
148+
wire _27_;
149+
wire _28_;
150+
wire _29_;
151+
wire _30_;
152+
wire _31_;
153+
wire _32_;
154+
wire _33_;
155+
wire _34_;
156+
wire _35_;
157+
wire _36_;
158+
wire _38_;
159+
wire _39_;
160+
wire _40_;
161+
wire _41_;
162+
wire _42_;
127163
wire [3:0] counter_q;
128164

129165
INV_X1 _49_ (.A(_41_),
@@ -217,6 +253,27 @@ module counter_U3 (clk_i,
217253
output count_valid_o;
218254

219255
wire count_valid_q;
256+
wire _12_;
257+
wire _13_;
258+
wire _14_;
259+
wire _15_;
260+
wire _16_;
261+
wire _26_;
262+
wire _27_;
263+
wire _28_;
264+
wire _29_;
265+
wire _30_;
266+
wire _31_;
267+
wire _32_;
268+
wire _33_;
269+
wire _34_;
270+
wire _35_;
271+
wire _36_;
272+
wire _38_;
273+
wire _39_;
274+
wire _40_;
275+
wire _41_;
276+
wire _42_;
220277
wire [3:0] counter_q;
221278

222279
INV_X1 _49_ (.A(_41_),

0 commit comments

Comments
 (0)