fvutils/pyvsc

Key Error in adding constraints in the for loop

kangshuo1 opened this issue · 0 comments

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.