Skip to content

Commit 7e85dd8

Browse files
committed
0.9.5
- (#237) - Add support for specifying cross-bins to ignore Signed-off-by: Matthew Ballance <[email protected]>
1 parent 845738a commit 7e85dd8

15 files changed

+198
-28
lines changed

doc/Changelog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
## 0.9.5
2+
- (#237) - Add support for specifying cross-bins to ignore
13

24
## 0.9.4
35
- (#233) - Propagate docstring and modulename across `randobj` inheritance

doc/source/coverage.rst

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,41 @@ compose the coverpoint cross.
332332
333333
self.cp1X2 = vsc.cross([self.cp1, self.cp2])
334334
335+
Coverpoint Cross Ignore Bins
336+
............................
337+
338+
Coverpoint cross-bins to ignore may be specified as follows.
339+
340+
.. code-block:: python3
341+
def filter(a, b):
342+
v_set = (1, 2, 4, 8)
343+
for i,v in enumerate(v_set):
344+
b_set = v_set[i+1:]
345+
if len(b_set) and a.intersect(v) and b.intersect(b_set):
346+
print("Intersect: a: %s ; b: %s" % (str(a.range), str(b.range)))
347+
return True
348+
return False
349+
350+
351+
@vsc.covergroup
352+
class cg_t(object):
353+
def __init__(self):
354+
self.with_sample(dict(
355+
a=vsc.int8_t(),
356+
b=vsc.int8_t()))
357+
self.cp_a = vsc.coverpoint(self.a,
358+
bins=dict(rng=vsc.bin_array([], 1, 2, 4, 8)))
359+
self.cp_b = vsc.coverpoint(self.b,
360+
bins=dict(rng=vsc.bin_array([], 1, 2, 4, 8)))
361+
self.cr = vsc.cross([self.cp_a, self.cp_b], ignore_bins=dict(b1=filter))
362+
363+
The `ignore_bins` argument must be a dictionary of bin-name and filter-method.
364+
The filter function is invoked with a bin specification for each coverpoint
365+
in the cross-point. The function returns `True` if the specified bin
366+
combination should be ignored and `False`` otherwise. In this case,
367+
bins where (b>a) are ignored.
368+
369+
335370
Specifying Coverpoint Sampling Conditions
336371
-----------------------------------------
337372
A sampling condition can be specified on both coverpoints and coverpoint

src/vsc/coverage.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,8 @@ def __init__(self,
899899
bins=None,
900900
options=None,
901901
name=None,
902-
iff=None):
902+
iff=None,
903+
ignore_bins=None):
903904
for t in target_l:
904905
if not isinstance(t, coverpoint):
905906
raise Exception("Cross target \"" + str(t) + "\" is not a coverpoint")
@@ -912,6 +913,7 @@ def __init__(self,
912913

913914
self.iff_f = None
914915
self.iff = None
916+
self.ignore_bins = ignore_bins
915917

916918
if iff is not None:
917919
with expr_mode():
@@ -946,7 +948,8 @@ def build_cov_model(self, parent, name):
946948
ret = CoverpointCrossModel(
947949
name if self.name is None else self.name,
948950
options,
949-
iff)
951+
iff,
952+
self.ignore_bins)
950953

951954
ret.srcinfo_decl = self.srcinfo_decl
952955

src/vsc/model/coverpoint_bin_array_model.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def dump(self, ind=""):
7272
pass
7373

7474
def get_bin_range(self, bin_idx):
75-
print("get_bin_range: " + str(bin_idx))
75+
return (self.low+bin_idx,)
7676

7777
def get_n_bins(self):
7878
return (self.high-self.low+1)

src/vsc/model/coverpoint_bin_collection_model.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,14 @@ def sample(self):
9595
return self.hit_bin_idx
9696

9797
def get_bin_range(self, idx):
98-
print("get_bin_range: " + str(idx))
9998
b = None
10099
for i in range(len(self.bin_l)):
101100
b = self.bin_l[i]
102101
if b.get_n_bins() > idx:
103102
break;
104103
idx -= b.get_n_bins()
105-
106-
return b.get_bin_range(idx)
104+
ret = b.get_bin_range(idx)
105+
return ret
107106

108107
def dump(self, ind=""):
109108
print(ind + "Bins " + self.name)

src/vsc/model/coverpoint_bin_enum_model.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ def finalize(self, bin_idx_base:int)->int:
3838

3939
def get_bin_name(self, bin_idx):
4040
return self.name
41+
42+
def get_bin_range(self, bin_idx):
43+
return (self.target_val,)
4144

4245
def sample(self):
4346
# Query value from the actual coverpoint or expression

src/vsc/model/coverpoint_bin_model_base.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ def get_bin_expr(self, idx):
5656
def get_bin_name(self, bin_idx):
5757
raise NotImplementedError()
5858

59+
def get_bin_range(self, bin_idx):
60+
raise NotImplementedError()
61+
5962
def sample(self):
6063
raise NotImplementedError("sample not implemented for " + str(type(self)))
6164

src/vsc/model/coverpoint_bin_single_bag_model.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ def get_bin_expr(self, bin_idx):
7171

7272
def get_bin_name(self, bin_idx):
7373
return self.name
74+
75+
def get_bin_range(self, bin_idx):
76+
return self.binspec
7477

7578
def sample(self):
7679
# Query value from the actual coverpoint or expression

src/vsc/model/coverpoint_bin_single_range_model.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ def get_bin_expr(self, bin_idx):
4141

4242
def get_bin_name(self, bin_idx):
4343
return self.name
44+
45+
def get_bin_range(self, bin_idx):
46+
return ((self.target_val_low, self.target_val_high),)
4447

4548
def sample(self):
4649
val = int(self.cp.get_val())

src/vsc/model/coverpoint_bin_single_val_model.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def get_bin_expr(self, bin_idx):
3434

3535
def get_bin_name(self, bin_idx):
3636
return self.name
37-
37+
3838
def sample(self):
3939
val = self.cp.get_val()
4040
if val == self.target_val:
@@ -48,8 +48,7 @@ def sample(self):
4848
return self.hit_bin_idx
4949

5050
def get_bin_range(self, idx):
51-
print("get_bin_range: " + str(idx))
52-
return RangelistModel([self.target_val])
51+
return (self.target_val,)
5352

5453
def accept(self, v):
5554
v.visit_coverpoint_bin_single(self)

0 commit comments

Comments
 (0)