1010from vsc .model .expr_literal_model import ExprLiteralModel
1111from vsc .model .expr_model import ExprModel
1212from vsc .model .expr_partselect_model import ExprPartselectModel
13+ from vsc .model .field_model import FieldModel
1314from vsc .model .field_scalar_model import FieldScalarModel
15+ from vsc .model .rand_set import RandSet
16+ from vsc .model .rand_state import RandState
1417from vsc .model .variable_bound_model import VariableBoundModel
1518
1619
1720class SolveGroupSwizzlerPartsel (object ):
1821
1922 def __init__ (self , randstate , solve_info , debug = 0 ):
2023 self .debug = debug
21- self .randstate = randstate
24+ self .randstate : RandState = randstate
2225 self .solve_info = solve_info
2326
2427 def swizzle (self ,
25- btor ,
26- rs ,
27- bound_m ):
28+ btor ,
29+ rs : RandSet ,
30+ bound_m : VariableBoundModel ):
2831 if self .debug > 0 :
2932 print ("--> swizzle_randvars" )
3033
@@ -51,7 +54,7 @@ def swizzle(self,
5154 if self .debug > 0 :
5255 print ("<-- swizzle_randvars" )
5356
54- def swizzle_field_l (self , field_l , rs , bound_m , btor ):
57+ def swizzle_field_l (self , field_l , rs : RandSet , bound_m , btor ):
5558 e = None
5659 if len (field_l ) > 0 :
5760 # Make a copy of the field list so we don't
@@ -96,7 +99,10 @@ def swizzle_field_l(self, field_l, rs, bound_m, btor):
9699 else :
97100 return False
98101
99- def swizzle_field (self , f , rs , bound_m ) -> ExprModel :
102+ def swizzle_field (self ,
103+ f : FieldScalarModel ,
104+ rs : RandSet ,
105+ bound_m : VariableBoundModel )-> ExprModel :
100106 ret = None
101107
102108 if self .debug > 0 :
@@ -106,14 +112,15 @@ def swizzle_field(self, f, rs, bound_m) -> ExprModel:
106112 if self .debug > 0 :
107113 print ("Note: field %s is in dist map" % f .name )
108114 for d in rs .dist_field_m [f ]:
109- print (" Target interval %d " % d .target_range )
115+ print (" Weight list %s " % d .weight_list )
110116 if len (rs .dist_field_m [f ]) > 1 :
111117 target_d = self .randstate .randint (0 , len (rs .dist_field_m [f ])- 1 )
112118 dist_scope_c = rs .dist_field_m [f ][target_d ]
113119 else :
114120 dist_scope_c = rs .dist_field_m [f ][0 ]
115121
116- target_w = dist_scope_c .dist_c .weights [dist_scope_c .target_range ]
122+ target_range = dist_scope_c .next_target_range (self .randstate )
123+ target_w = dist_scope_c .dist_c .weights [target_range ]
117124 if target_w .rng_rhs is not None :
118125 # Dual-bound range
119126 val_l = target_w .rng_lhs .val ()
@@ -129,6 +136,8 @@ def swizzle_field(self, f, rs, bound_m) -> ExprModel:
129136 else :
130137 # Single value
131138 val = target_w .rng_lhs .val ()
139+ if self .debug > 0 :
140+ print ("Select dist-weight value %d" % (int (val )))
132141 ret = [ExprBinModel (
133142 ExprFieldRefModel (f ),
134143 BinExprType .Eq ,
0 commit comments