Key Error in adding constraints in the for loop
kangshuo1 opened this issue · 0 comments
kangshuo1 commented
I encountered this problem many times while using pyvsc, but I don't know what caused it.
Here is one example.
import vsc
from vsc import unsigned
@vsc.randobj
class item1(object):
def __init__(self) -> None:
self.array_pos_center_grid_h = [i+1 for i in range(27)]
self.array_pos_center_grid_w = [i+1 for i in range(35)]
self.array_center_reciprocal_h = vsc.rand_list_t(vsc.bit_t(25), 26)
self.array_center_reciprocal_w = vsc.rand_list_t(vsc.bit_t(25), 34)
self.array_shift_h = vsc.rand_list_t(vsc.bit_t(28), 7)
self.array_shift_w = vsc.rand_list_t(vsc.bit_t(28), 9)
print(self.array_pos_center_grid_h)
@vsc.constraint
def array_center_reciprocal_h_c(self):
for i in range(26):
if i%4 == 0:
self.array_center_reciprocal_h[i] == ((unsigned(1)<<((self.array_shift_h[i//4]&0x7F)+9)) + self.array_pos_center_grid_h[i+1]-self.array_pos_center_grid_h[i] - 1)//(self.array_pos_center_grid_h[i+1]-self.array_pos_center_grid_h[i])
if i%4 == 1:
self.array_center_reciprocal_h[i] == ((unsigned(1)<<(((self.array_shift_h[i//4]>>7)&0x7F)+9)) + self.array_pos_center_grid_h[i+1]-self.array_pos_center_grid_h[i] - 1)//(self.array_pos_center_grid_h[i+1]-self.array_pos_center_grid_h[i])
if i%4 == 2:
self.array_center_reciprocal_h[i] == ((unsigned(1)<<(((self.array_shift_h[i//4]>>14)&0x7F)+9)) + self.array_pos_center_grid_h[i+1]-self.array_pos_center_grid_h[i] - 1)//(self.array_pos_center_grid_h[i+1]-self.array_pos_center_grid_h[i])
if i%4 == 3:
self.array_center_reciprocal_h[i] == ((unsigned(1)<<(((self.array_shift_h[i//4]>>21)&0x7F)+9)) + self.array_pos_center_grid_h[i+1]-self.array_pos_center_grid_h[i] - 1)//(self.array_pos_center_grid_h[i+1]-self.array_pos_center_grid_h[i])
@vsc.constraint
def array_center_reciprocal_w_c(self):
for i in range(34):
if i%4 == 0:
self.array_center_reciprocal_w[i] == ((unsigned(1)<<((self.array_shift_w[i//4]&0x7F)+9)) + self.array_pos_center_grid_w[i+1]-self.array_pos_center_grid_w[i] - 1)//(self.array_pos_center_grid_w[i+1]-self.array_pos_center_grid_w[i])
if i%4 == 1:
self.array_center_reciprocal_w[i] == ((unsigned(1)<<(((self.array_shift_w[i//4]>>7)&0x7F)+9)) + self.array_pos_center_grid_w[i+1]-self.array_pos_center_grid_w[i] - 1)//(self.array_pos_center_grid_w[i+1]-self.array_pos_center_grid_w[i])
if i%4 == 2:
self.array_center_reciprocal_w[i] == ((unsigned(1)<<(((self.array_shift_w[i//4]>>14)&0x7F)+9)) + self.array_pos_center_grid_w[i+1]-self.array_pos_center_grid_w[i] - 1)//(self.array_pos_center_grid_w[i+1]-self.array_pos_center_grid_w[i])
if i%4 == 3:
self.array_center_reciprocal_w[i] == ((unsigned(1)<<(((self.array_shift_w[i//4]>>21)&0x7F)+9)) + self.array_pos_center_grid_w[i+1]-self.array_pos_center_grid_w[i] - 1)//(self.array_pos_center_grid_w[i+1]-self.array_pos_center_grid_w[i])
@vsc.constraint
def array_shift_h_c(self):
with vsc.foreach(self.array_shift_h, idx=True) as i:
self.array_shift_h[i] in vsc.rangelist((0, 268435455))
for i in range(7):
self.array_shift_h[i]&0x7F <= 63
(self.array_shift_h[i]>>7)&0x7F <= 63
(self.array_shift_h[i]>>14)&0x7F <= 63
(self.array_shift_h[i]>>21)&0x7F <= 63
if i < 6:
self.array_shift_h[i]&0x7F == self.array_pos_center_grid_h[i*4+1]-self.array_pos_center_grid_h[i*4]+14
(self.array_shift_h[i]>>7)&0x7F == self.array_pos_center_grid_h[4*i+2]-self.array_pos_center_grid_h[4*i+1]+14
(self.array_shift_h[i]>>14)&0x7F == self.array_pos_center_grid_h[4*i+3]-self.array_pos_center_grid_h[4*i+2]+14
(self.array_shift_h[i]>>21)&0x7F == self.array_pos_center_grid_h[4*i+4]-self.array_pos_center_grid_h[4*i+3]+14
else:
self.array_shift_h[6]&0x7F == self.array_pos_center_grid_h[25]-self.array_pos_center_grid_h[24]+14
(self.array_shift_h[6]>>7)&0x7F == self.array_pos_center_grid_h[26]-self.array_pos_center_grid_h[25]+14
@vsc.constraint
def array_shift_w_c(self):
with vsc.foreach(self.array_shift_w, idx=True) as i:
self.array_shift_w[i] in vsc.rangelist((0, 268435455))
for i in range(9):
self.array_shift_w[i]&0x7F <= 63
(self.array_shift_w[i]>>7)&0x7F <= 63
(self.array_shift_w[i]>>14)&0x7F <= 63
(self.array_shift_w[i]>>21)&0x7F <= 63
if i < 8:
self.array_shift_w[i]&0x7F == self.array_pos_center_grid_w[4*i+1]-self.array_pos_center_grid_w[4*i]+14
(self.array_shift_w[i]>>7)&0x7F == self.array_pos_center_grid_w[4*i+2]-self.array_pos_center_grid_w[4*i+1]+14
(self.array_shift_w[i]>>14)&0x7F == self.array_pos_center_grid_w[4*i+3]-self.array_pos_center_grid_w[4*i+2]+14
(self.array_shift_w[i]>>21)&0x7F == self.array_pos_center_grid_w[4*i+4]-self.array_pos_center_grid_w[4*i+3]+14
else:
self.array_shift_w[8]&0x7F == self.array_pos_center_grid_w[33]-self.array_pos_center_grid_w[32]+14
(self.array_shift_w[8]>>7)&0x7F == self.array_pos_center_grid_w[34]-self.array_pos_center_grid_w[33]+14
def main():
random1 = item1()
random1.randomize()
if __name__ == "__main__":
main()
Output:
kangshuo@oa-wssong1:~/work/f1_constraint$ python3 ./test1.py
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]
Traceback (most recent call last):
File "./test1.py", line 83, in <module>
main()
File "./test1.py", line 79, in main
random1.randomize()
File "/home/kangshuo/work/pyvsc/src/vsc/rand_obj.py", line 162, in randomize
Randomizer.do_randomize(
File "/home/kangshuo/work/pyvsc/src/vsc/model/randomizer.py", line 593, in do_randomize
ri = RandInfoBuilder.build(field_model_l, constraint_l, Randomizer._rng)
File "/home/kangshuo/work/pyvsc/src/vsc/model/rand_info_builder.py", line 116, in build
fm.accept(builder)
File "/home/kangshuo/work/pyvsc/src/vsc/model/field_composite_model.py", line 154, in accept
v.visit_composite_field(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/rand_info_builder.py", line 429, in visit_composite_field
super().visit_composite_field(f)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 68, in visit_composite_field
c.accept(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/constraint_block_model.py", line 42, in accept
v.visit_constraint_block(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/rand_info_builder.py", line 176, in visit_constraint_block
super().visit_constraint_block(c)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 107, in visit_constraint_block
self.visit_constraint_scope(c)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 147, in visit_constraint_scope
cc.accept(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/constraint_expr_model.py", line 40, in accept
visitor.visit_constraint_expr(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/rand_info_builder.py", line 227, in visit_constraint_expr
super().visit_constraint_expr(c)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 115, in visit_constraint_expr
c.e.accept(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/expr_bin_model.py", line 178, in accept
visitor.visit_expr_bin(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 166, in visit_expr_bin
e.rhs.accept(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/expr_bin_model.py", line 178, in accept
visitor.visit_expr_bin(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 165, in visit_expr_bin
e.lhs.accept(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/expr_bin_model.py", line 178, in accept
visitor.visit_expr_bin(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 165, in visit_expr_bin
e.lhs.accept(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/expr_bin_model.py", line 178, in accept
visitor.visit_expr_bin(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 165, in visit_expr_bin
e.lhs.accept(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/expr_bin_model.py", line 178, in accept
visitor.visit_expr_bin(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 165, in visit_expr_bin
e.lhs.accept(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/expr_bin_model.py", line 178, in accept
visitor.visit_expr_bin(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 166, in visit_expr_bin
e.rhs.accept(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/expr_bin_model.py", line 178, in accept
visitor.visit_expr_bin(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 165, in visit_expr_bin
e.lhs.accept(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/expr_bin_model.py", line 178, in accept
visitor.visit_expr_bin(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 165, in visit_expr_bin
e.lhs.accept(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/expr_bin_model.py", line 178, in accept
visitor.visit_expr_bin(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/model_visitor.py", line 165, in visit_expr_bin
e.lhs.accept(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/expr_array_subscript_model.py", line 58, in accept
v.visit_expr_array_subscript(self)
File "/home/kangshuo/work/pyvsc/src/vsc/model/rand_info_builder.py", line 314, in visit_expr_array_subscript
self._randset_m.pop(idx)
KeyError: 1
Do you have any suggestions to avoid such problems?
Looking forward to your reply.