@@ -31,32 +31,36 @@ def build(db : 'UCIS') ->'CoverageReport':
3131
3232
3333 def _build (self )-> 'CoverageReport' :
34-
34+
35+ all_coverage = 0.0
36+ all_div = 0
3537 for iscope in self .db .scopes (ScopeTypeT .INSTANCE ):
36- self .build_covergroups (iscope )
37-
38+ cov , div = self .build_covergroups (iscope )
39+ all_coverage += cov
40+ all_div += div
41+
42+ if all_div > 0 :
43+ self .report .coverage = all_coverage / all_div
44+ else :
45+ self .report .coverage = 0.0
46+
3847 return self .report
39-
4048
4149 def build_covergroups (self , iscope ):
42-
50+
4351 coverage = 0.0
4452 div = 0
45-
53+
4654 for cg_t in iscope .scopes (ScopeTypeT .COVERGROUP ):
4755 cg = self .build_covergroup (cg_t )
4856 if cg .weight > 0 :
4957 coverage += cg .coverage * cg .weight
5058 div += cg .weight
5159 self .report .covergroups .append (cg )
5260 self .report .covergroup_m [cg .instname ] = cg
53-
54- # Handle case when there are no covergroups
55- if div > 0 :
56- self .report .coverage = coverage / div
57- else :
58- self .report .coverage = 0.0
59-
61+
62+ return coverage , div
63+
6064 def build_covergroup (self , cg_n )-> CoverageReport .Covergroup :
6165 cg_r = CoverageReport .Covergroup (
6266 cg_n .getScopeName (),
@@ -85,7 +89,12 @@ def build_covergroup(self, cg_n)->CoverageReport.Covergroup:
8589 for cr in cg_r .crosses :
8690 coverage += cr .coverage * cr .weight
8791 div += cr .weight
88-
92+
93+ for sub in cg_r .covergroups :
94+ if sub .weight > 0 :
95+ coverage += sub .coverage * sub .weight
96+ div += sub .weight
97+
8998 if div > 0 : coverage /= div
9099
91100 cg_r .coverage = coverage
@@ -96,37 +105,44 @@ def build_coverpoint(self, cp_n : Coverpoint):
96105 cp_r = CoverageReport .Coverpoint (cp_n .getScopeName ())
97106 cp_r .weight = cp_n .getWeight ()
98107
99- # Read in bins
108+ # Read in bins — check both direct cover items and typed bin
109+ # sub-scopes (CVGBINSCOPE, IGNOREBINSCOPE, ILLEGALBINSCOPE).
100110 num_hit = 0
101111 total = 0
102- for ci_n in cp_n .coverItems (CoverTypeT .CVGBIN ):
103- cvg_data = ci_n .getCoverData ()
104-
105- if cvg_data .data >= cvg_data .at_least :
106- num_hit += 1
107-
108- cp_r .bins .append (CoverageReport .CoverBin (
109- ci_n .getName (),
110- cvg_data .at_least ,
111- cvg_data .data ))
112112
113- total += 1
114-
115- for ci_n in cp_n .coverItems (CoverTypeT .IGNOREBIN ):
116- cvg_data = ci_n .getCoverData ()
117-
118- cp_r .ignore_bins .append (CoverageReport .CoverBin (
119- ci_n .getName (),
120- cvg_data .at_least ,
121- cvg_data .data ))
122-
123- for ci_n in cp_n .coverItems (CoverTypeT .ILLEGALBIN ):
124- cvg_data = ci_n .getCoverData ()
125-
126- cp_r .illegal_bins .append (CoverageReport .CoverBin (
127- ci_n .getName (),
128- cvg_data .at_least ,
129- cvg_data .data ))
113+ def _collect_items (scope ):
114+ """Yield (cover_item, effective_type) from a scope."""
115+ for ci in scope .coverItems (CoverTypeT .CVGBIN ):
116+ yield ci , CoverTypeT .CVGBIN
117+ for ci in scope .coverItems (CoverTypeT .IGNOREBIN ):
118+ yield ci , CoverTypeT .IGNOREBIN
119+ for ci in scope .coverItems (CoverTypeT .ILLEGALBIN ):
120+ yield ci , CoverTypeT .ILLEGALBIN
121+
122+ # Collect from direct items on the coverpoint
123+ sources = [cp_n ]
124+ # Also collect from typed bin sub-scopes
125+ for sub in cp_n .scopes (ScopeTypeT .CVGBINSCOPE ):
126+ sources .append (sub )
127+ for sub in cp_n .scopes (ScopeTypeT .IGNOREBINSCOPE ):
128+ sources .append (sub )
129+ for sub in cp_n .scopes (ScopeTypeT .ILLEGALBINSCOPE ):
130+ sources .append (sub )
131+
132+ for src in sources :
133+ for ci_n , ct in _collect_items (src ):
134+ cvg_data = ci_n .getCoverData ()
135+ bin_obj = CoverageReport .CoverBin (
136+ ci_n .getName (), cvg_data .at_least , cvg_data .data )
137+ if ct == CoverTypeT .CVGBIN :
138+ cp_r .bins .append (bin_obj )
139+ total += 1
140+ if cvg_data .data >= cvg_data .at_least :
141+ num_hit += 1
142+ elif ct == CoverTypeT .IGNOREBIN :
143+ cp_r .ignore_bins .append (bin_obj )
144+ elif ct == CoverTypeT .ILLEGALBIN :
145+ cp_r .illegal_bins .append (bin_obj )
130146
131147 if total > 0 :
132148 cp_r .coverage = (100 * num_hit )/ total
@@ -161,4 +177,4 @@ def build_cross(self, cr_n : Cross):
161177
162178
163179
164-
180+
0 commit comments