fvutils / pyvsc

Python packages providing a library for Verification Stimulus and Coverage
https://fvutils.github.io/pyvsc
Apache License 2.0
113 stars 26 forks source link

Error for constraint failure #37

Closed ShraddhaDevaiya closed 4 years ago

ShraddhaDevaiya commented 4 years ago

Hi @mballance , I was trying this code, but it is giving an error for constraint failure.

import vsc

@vsc.randobj
class my_s(object):
    def __init__(self):
        super().__init__()
        self.num_of_nested_loop = vsc.rand_bit_t(8)
        self.loop_init_val = vsc.rand_list_t(vsc.uint8_t())

    @vsc.constraint
    def ab_con(self):
        self.num_of_nested_loop.inside(vsc.rangelist(1,2))
        self.loop_init_val.size == self.num_of_nested_loop;

item = my_s()

for i in range(5):
    item.randomize()
    print("A = ",item.num_of_nested_loop,", B = ",item.loop_init_val)

and this is giving an error like following :

Failed constraints:
[1]: num_of_nested_loop in [2, 1];

[1]: num_of_nested_loop in [2, 1];

[2]: (size == num_of_nested_loop);

[2]: (0 == num_of_nested_loop);

Solve failure
Traceback (most recent call last):
  File "usecase.py", line 22, in <module>
    item.randomize()
  File "/home/shraddha/.local/lib/python3.6/site-packages/vsc/rand_obj.py", line 107, in randomize
    Randomizer.do_randomize([model])
  File "/home/shraddha/.local/lib/python3.6/site-packages/vsc/model/randomizer.py", line 855, in do_randomize
    r.randomize(ri, bounds_v.bound_m)
  File "/home/shraddha/.local/lib/python3.6/site-packages/vsc/model/randomizer.py", line 160, in randomize
    raise Exception("solve failure")
Exception: solve failure

I think for this we need solve before constraint . Can you please take a look into it?

mballance commented 4 years ago

Hi @ShraddhaDevaiya, You'll need to make two changes to make this work:

import vsc

@vsc.randobj
class my_s(object):
    def __init__(self):
        super().__init__()
        self.num_of_nested_loop = vsc.rand_bit_t(8)
        self.loop_init_val = vsc.randsz_list_t(vsc.uint8_t())

    @vsc.constraint
    def ab_con(self):
        self.num_of_nested_loop.inside(vsc.rangelist(1,2))
        self.loop_init_val.size.inside(vsc.rangelist(1,2))
        self.loop_init_val.size == self.num_of_nested_loop;

item = my_s()

for i in range(5):
    item.randomize()
    print("A = ",item.num_of_nested_loop,", B = ",item.loop_init_val)

Best Regards, Matthew

ShraddhaDevaiya commented 4 years ago

Yeah it is working this way. Thanks for helping !

Regards, Shraddha Devaiya.

ShraddhaDevaiya commented 4 years ago

Hi @mballance , One more issue I am facing in this case is like, it is iterating or randomizing every time with fix numbers. Like following is the code :

import vsc

@vsc.randobj
class my_s(object):
    def __init__(self):
        super().__init__()
        self.num_of_nested_loop = vsc.rand_bit_t(8)
        self.loop_init_val = vsc.randsz_list_t(vsc.uint8_t())

    @vsc.constraint
    def ab_con(self):
        self.num_of_nested_loop.inside(vsc.rangelist(1,2))
        self.loop_init_val.size.inside(vsc.rangelist(1,2))
        self.loop_init_val.size == self.num_of_nested_loop

item = my_s()

for i in range(3):
    item.randomize()
    print("A = ",item.num_of_nested_loop,", B = ",item.loop_init_val)

So, for this we should get 3 prints , but every time it is giving an output like this for any value of range() :

A =  1 , B =  [100]
A =  2 , B =  [126, 210]
A =  1 , B =  [184]
A =  1 , B =  [204]
A =  2 , B =  [7, 189]
A =  1 , B =  [6]
A =  2 , B =  [33, 71]
A =  1 , B =  [219]
A =  2 , B =  [61, 59]
A =  1 , B =  [39]
A =  1 , B =  [129]
A =  1 , B =  [208]
A =  1 , B =  [164]

Can you please help in this ?

Thanks & Regards, Shraddha Devaiya.