Exemplo n.º 1
0
 def __init__(self, file, bound=0, period=0, realPeroid=0):
     ccsl = CCSL(file)
     tmp = ccsl.workOnCCSL()
     self.oldClocks = tmp["oldClocks"]
     self.newClocks = tmp["newClocks"]
     self.newCCSLConstraintList = tmp["newCCSLConstraintList"]
     self.oldCCSLConstraintList = tmp["oldCCSLConstraintList"]
     self.parameter = tmp["parameter"]
     self.bound = bound
     self.period = period
     self.realPeroid = realPeroid
     self.parameterRange = []
     self.solver = z3.SolverFor("AUFLIRA")
     z3.set_param("smt.random_seed", random.randint(100, 1000000))
     self.solver.set(unsat_core=True)
     # self.solver.set(produce_models=True)
     # self.solver.set(print_success=False)
     self.printParameter = {}
     self.tickStep = {}
     self.n = z3.Int("n")
     if self.period > 0:
         self.k = z3.Int("k")
         self.l = z3.Int("l")
         self.p = z3.Int("p")
     self.tickDict = {}
     self.historyDict = {}
     self.Tick_result = {}
     self.cnt = 0
Exemplo n.º 2
0
 def addHistory(self):
     for clock in self.newClocks:
         history = None
         tick = self.tickDict["t_%s" % (clock)]
         if ("h_%s" % (clock)) not in self.historyDict.keys():
             history = z3.Function("h_%s" % (clock), z3.IntSort(),
                                   z3.IntSort())
             self.historyDict["h_%s" % (clock)] = history
         else:
             history = self.historyDict["h_%s" % (clock)]
         # self.solver.add(history(0) == z3.IntVal(0))
         self.solver.add(history(1) == z3.IntVal(0))
         if self.bound > 0:
             # If the bound is finite, we define the history of the clock with a fixed bound.
             for i in range(1, self.bound + 1):
                 self.solver.add(
                     z3.If(tick(i),
                           history(i + 1) == history(i) + 1,
                           history(i + 1) == history(i)))
                 # self.solver.add(z3.If(tick(i),
                 #                       history(i + 1) == history(i) + 1,
                 #                       history(i + 1) == history(i)))
         elif self.bound == 0:
             x = z3.Int("x")
             # If the bound is infinite, we define the history of the clock infinitely.
             self.solver.add(
                 z3.ForAll(
                     x,
                     z3.Implies(
                         x >= 1,
                         z3.If(tick(x),
                               history(x + 1) == history(x) + 1,
                               history(x + 1) == history(x)))))
Exemplo n.º 3
0
    def verifyExpr(self, expr):
        self.funcproto.expr = expr

        counterexample = self.z3checker.check(str(self.funcproto),
                                              self.moreconstraint)

        def testDelete():
            if len(self.moreconstraint) == 0:
                return None
            self.moreconstraint.pop(-1)
            counterexample = self.z3checker.check(str(self.funcproto),
                                                  self.moreconstraint)
            if counterexample is None:
                return testDelete()
            return counterexample

        if counterexample is None:
            counterexample = testDelete()
            if counterexample is None:
                return None, None
        # counterexample = self.z3checker.check(str(self.funcproto), randomConstraint)
        symtab = {}
        for i in range(len(self.inputlist)):
            s = self.inputlist[i]
            if self.inputtylist[i] == 'Int':
                symtab[s] = int(str(counterexample.eval(z3.Int(s), True)))
            else:
                symtab[s] = int(str(counterexample.eval(z3.Bool(s), True)))
        innersymtab = self.semchecker.getSymtab(symtab)
        symtab = [symtab] * len(innersymtab)
        return innersymtab, symtab
Exemplo n.º 4
0
 def addTickSMT(self):
     for each in self.newClocks:
         self.tickDict["t_%s" % (each)] = z3.Function(
             "t_%s" % (each), z3.IntSort(), z3.BoolSort())
         tick = self.tickDict["t_%s" % (each)]
         if self.bound > 0:
             y = z3.Int("y")
             if self.period > 0:
                 for y in range(1, self.bound + 1):
                     self.solver.add(
                         z3.Implies(
                             y >= self.k,
                             tick((y - self.l) % self.p +
                                  self.l) == tick(y)))
                 # self.solver.add(
                 #     z3.ForAll(y,z3.Implies(
                 #         z3.And(y >= self.k,y <= self.bound),
                 #         tick((y - self.l) % self.p + self.l) == tick(y))))
         elif self.bound == 0:
             x = z3.Int("x")
             if self.period > 0:
                 y = z3.Int("y")
                 self.solver.add(
                     z3.ForAll(
                         y,
                         z3.Implies(
                             y >= self.k,
                             tick((y - self.l) % self.p +
                                  self.l) == tick(y))))
     clockListTmp = []
     x = z3.Int("x")
     for each in self.tickDict.keys():
         tick = self.tickDict[each]
         clockListTmp.append(tick(x))
     if self.bound == 0:
         self.solver.add(
             z3.ForAll(x, z3.Implies(x >= 1, z3.Or(clockListTmp))))
     else:
         for i in range(1, self.bound + 1):
             tmp = []
             for tick in self.tickDict.values():
                 tmp.append(tick(i))
             self.solver.add(z3.Or(tmp))
Exemplo n.º 5
0
 def addTickStep(self, clock):
     tick = self.tickDict["t_%s" % (clock)]
     history = self.historyDict["h_%s" % (clock)]
     if "s_%s" % (clock) not in self.tickStep.keys():
         tickStep = z3.Function("s_%s" % (clock), z3.IntSort(),
                                z3.IntSort())
         self.tickStep["s_%s" % (clock)] = tickStep
         if self.bound > 0:
             x = z3.Int("x")
             # If the bound is infinite, we define the history of the clock infinitely.
             for i in range(1, self.bound + 1):
                 self.solver.add(
                     z3.Implies(tick(i),
                                tickStep(history(i) + 1) == i))
         elif self.bound == 0:
             x = z3.Int("x")
             # If the bound is infinite, we define the history of the clock infinitely.
             self.solver.add(
                 z3.ForAll(
                     x,
                     z3.Implies(z3.And(x >= 1, tick(x)),
                                tickStep(history(x) + 1) == x)))
Exemplo n.º 6
0
 def addTickForever(self):
     """
     Adding a clock msec, which ticks every step, represents the real-time.
     :return:
     """
     if "msec" in self.oldClocks:
         tick = self.tickDict["t_%s" % ("msec")]
         if self.bound > 0:
             for i in range(1, self.bound + 1):
                 self.solver.add(tick(i) == True)
         else:
             x = z3.Int("x")
             self.solver.add(
                 z3.ForAll(x, z3.Implies(x >= 1,
                                         tick(x) == True)))
Exemplo n.º 7
0
 def new_from_sort(self, key):
     if isinstance(key, Bool):
         key = key.name
         val = z3.Bool(key)
         return val
     elif isinstance(key, Int):
         key = key.name
         val = z3.Int(key)
         return val
     elif isinstance(key, String):
         key = key.name
         val = z3.String(key)
         return val
     elif isinstance(key, BitVec):
         name = key.name
         size = key.size
         val = z3.BitVec(name, size)
         return val
     raise TypeError("%s not supported!" %type(key))
Exemplo n.º 8
0
def translate(expr, xid):
    substitutions = dict()

    def raw(s):
        return '_'.join(s.split('_')[:-1])

    for v in get_vars_non_recursive(expr):
        if v not in substitutions:
            v_name = raw(v.decl().name())
            if v.sort_kind() == z3.Z3_INT_SORT:
                substitutions[v] = z3.Int('%s_%d' % (v_name, xid))
            elif v.sort_kind() == z3.Z3_BOOL_SORT:
                substitutions[v] = z3.Bool('%s_%d' % (v_name, xid))
            elif v.sort_kind() == z3.Z3_BV_SORT:
                substitutions[v] = z3.BitVec('%s_%d' % (v_name, xid), v.size())
            elif v.sort_kind() == z3.Z3_ARRAY_SORT:
                substitutions[v] = z3.Array('%s_%d' % (v_name, xid), v.domain(), v.range())
            else:
                raise Exception('CANNOT CONVERT %s (%d)' % (v, v.sort_kind()))
    subst = list(substitutions.items())
    return z3.substitute(expr, subst)
Exemplo n.º 9
0
    def verifyExpr(self, expr):
        randomConstraint = [['constraint', ['>=', 'x', '5']],
                            ['constraint', ['>=', 'y', '5']],
                            ['constraint', ['>=', 'z', '5']],
                            ['constraint', ['>=', 'w', '5']],
                            ['constraint', ['true']]]
        self.funcproto.expr = expr

        counterexample = self.z3checker.check(str(self.funcproto), [])
        if counterexample is None:
            return None, None
        # counterexample = self.z3checker.check(str(self.funcproto), randomConstraint)
        symtab = {}
        for i in range(len(self.inputlist)):
            s = self.inputlist[i]
            if self.inputtylist[i] == 'Int':
                symtab[s] = int(str(counterexample.eval(z3.Int(s), True)))
            else:
                symtab[s] = int(str(counterexample.eval(z3.Bool(s), True)))
        innersymtab = self.semchecker.getSymtab(symtab)
        symtab = [symtab] * len(innersymtab)
        return innersymtab, symtab
Exemplo n.º 10
0
 def op(self, instruction: Instruction, stack: Stack,
        immutable_storage_references: List[ImmutableStorageTracker]):
     # cases that the timestamp is used in conditional jump
     if instruction.opcode == "JUMPI":
         # 检查是否是时间戳与一个固定值进行比较
         if utils.is_symbol(stack[-2]):
             for z3_ref in utils.extract_z3_ref(stack[-2]):
                 if utils.is_z3_constant(z3_ref):
                     # 是一个z3表达式中的常量
                     continue
                 elif z3.eq(z3_ref, z3.Int("IHs")):
                     # 是时间戳
                     continue
                 else:
                     for ref in immutable_storage_references:
                         if ref.contains(
                                 len(stack) - 2) and utils.is_symbol(
                                     ref.storage_value) and utils.in_list(
                                         utils.extract_z3_ref(
                                             ref.storage_value), z3_ref):
                             break
                     else:
                         # 不是一个不可变Storage变量
                         break
                     # 是某一个不可变Storage变量
                     continue
             else:
                 # 参与比较的所有变量都是常量(除了时间戳本身)
                 self.pop(instruction.input_amount, len(stack))
                 return
         not_used_before = not self.used
         self.use(instruction, len(stack))
         if not_used_before and self.used:
             self.dependency_addr = instruction.addr
     else:
         self.pop(instruction.input_amount, len(stack))
def generate_assignments(thresh=2):

    solver = z3.Solver()
    # declare the SMT variables for the specific code
    block_1 = {'b1_1': 'move'}
    block_1_obj = SMT_Block(block_1, thresh)
    values = block_1_obj.block_values
    block_1_vars = [ele.var for ele in block_1_obj.block_z3_vars
                    ]  # for the conditional constraints

    c1 = z3.Int('c1')  # 4 (repeat)
    values.append(z3.Or(c1 == 3, c1 == 4, c1 == 5), )

    block_2 = {'b2_1': 'turn_left'}
    block_2_obj = SMT_Block(block_2, thresh)
    values.extend(block_2_obj.block_values)
    block_2_vars = [ele.var for ele in block_2_obj.block_z3_vars
                    ]  # for the conditional constraints

    c2 = z3.Int('c2')  # 5 (repeat)
    values.append(z3.Or(c2 == 4, c2 == 5, c2 == 6), )

    block_3 = {'b3_1': 'move'}
    block_3_obj = SMT_Block(block_3, thresh)
    values.extend(block_3_obj.block_values)
    block_3_vars = [ele.var for ele in block_3_obj.block_z3_vars
                    ]  # for the conditional constraints

    # add another block in the beginning of the code
    block_4 = {'b4_1': 'phi'}
    block_4_obj = SMT_Block(block_4, thresh)
    values.extend(block_4_obj.block_values)
    block_4_vars = [ele.var for ele in block_4_obj.block_z3_vars]

    # add another block in the end of the code
    block_5 = {'b5_1': 'phi'}
    block_5_obj = SMT_Block(block_5, thresh)
    values.extend(block_5_obj.block_values)
    block_5_vars = [ele.var for ele in block_5_obj.block_z3_vars]

    # all block objects
    block_objs = [
        block_1_obj, block_2_obj, block_3_obj, block_4_obj, block_5_obj
    ]

    X = [ele.var for ele in block_1_obj.block_z3_vars
         ]  # added the variables for block 1
    X.append(c1)  # added the conditional variable
    X.extend([ele.var for ele in block_2_obj.block_z3_vars
              ])  # added the variables for block 2
    X.append(c2)  # added the conditional variable
    X.extend([ele.var for ele in block_3_obj.block_z3_vars
              ])  # added the variables for block 3

    X.extend([ele.var for ele in block_4_obj.block_z3_vars
              ])  # added the variables for block 4
    X.extend([ele.var for ele in block_5_obj.block_z3_vars
              ])  # added the variables for block 5


    constraints = block_1_obj.block_append_constraints + block_1_obj.flip_turns_constraints + block_1_obj.block_elimination_constraints + \
                  block_2_obj.block_append_constraints + block_2_obj.flip_turns_constraints + block_2_obj.block_elimination_constraints + \
                  block_3_obj.block_append_constraints + block_3_obj.flip_turns_constraints + block_3_obj.block_elimination_constraints + \
                  block_4_obj.block_append_constraints + block_4_obj.flip_turns_constraints + block_4_obj.block_elimination_constraints + \
                  block_5_obj.block_append_constraints + block_5_obj.flip_turns_constraints + block_5_obj.block_elimination_constraints

    single_block_change_cons = single_block_change(block_objs)

    constraints.extend(single_block_change_cons)

    # add the values and the constraints
    solver.add(values + constraints)

    # generate all the assignments
    models = gen_all(solver, X)
    assignments = []
    for model in models:

        a = [str(model[c1].as_long())]
        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_1_vars
        ])

        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_2_vars
        ])

        a.append(str(model[c2].as_long()))

        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_3_vars
        ])

        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_4_vars
        ])

        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_5_vars
        ])

        assignments.append(a)
        #print(a)

    #print('Found #{} SAT values'.format(len(models)))
    return assignments
def generate_assignments(thresh=2):

    solver = z3.Solver()
    # declare the SMT variables for the specific code
    block_1 = {'b1_1': 'turn_right'}
    block_1_obj = SMT_Block(block_1, thresh)
    values = block_1_obj.block_values

    c1 = z3.Int('c1')  # 5 (repeat)
    values.append(z3.Or(c1 == 4, c1 == 5, c1 == 6), )

    block_2 = {'b2_1': 'move'}
    block_2_obj = SMT_Block(block_2, thresh)
    values.extend(block_2_obj.block_values)

    # additional empty block added in the end of the code
    block_3 = {'b3_1': 'phi'}
    block_3_obj = SMT_Block(block_3, thresh)
    values.extend(block_3_obj.block_values)

    # all block objects
    block_objs = [block_1_obj, block_2_obj, block_3_obj]

    X = [ele.var for ele in block_1_obj.block_z3_vars
         ]  # added the variables for block 1
    X.append(c1)  # added the conditional variable
    X.extend([ele.var for ele in block_2_obj.block_z3_vars
              ])  # added the variables for block 2

    block_3_vars = [ele.var for ele in block_3_obj.block_z3_vars]
    X.extend(block_3_vars)  # added the variables for block 3


    constraints = block_1_obj.block_append_constraints + block_1_obj.flip_turns_constraints + block_1_obj.block_elimination_constraints  \
                  + block_2_obj.block_append_constraints + block_2_obj.flip_turns_constraints + block_2_obj.block_elimination_constraints \
                  + block_3_obj.block_append_constraints + block_3_obj.flip_turns_constraints + block_3_obj.block_elimination_constraints

    single_block_change_cons = single_block_change(block_objs)

    constraints.extend(single_block_change_cons)

    # add the values and the constraints
    solver.add(values + constraints)

    # generate all the assignments
    models = gen_all(solver, X)
    assignments = []
    for model in models:
        a = [
            type_to_str[VariableType(model[ele].as_long())]
            for ele in X[:block_1_obj.size]
        ]
        a.append(str(model[c1].as_long()))

        b = [
            type_to_str[VariableType(model[ele].as_long())]
            for ele in X[block_2_obj.size + 1:]
        ]
        a.extend(b)

        c = [
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_3_vars
        ]
        a.extend(c)
        assignments.append(a)
        #print(a)

    #print('Found #{} SAT values'.format(len(models)))
    return assignments
Exemplo n.º 13
0
def generate_assignments(thresh=2):

    solver = z3.Solver()
    # Block 1
    block_1 = {'b1_1': 'move'}
    block_1_obj = SMT_Block(block_1, thresh)
    values = block_1_obj.block_values
    block_1_vars = [ele.var for ele in block_1_obj.block_z3_vars
                    ]  # for the conditional constraints

    c1 = z3.Int('c1')  # bool_path_left (if_only)
    values.append(z3.Or(c1 == 8, c1 == 9))

    block_2 = {'b2_1': 'turn_left'}
    block_2_obj = SMT_Block(block_2, thresh)
    values.extend(block_2_obj.block_values)
    block_2_vars = [ele.var for ele in block_2_obj.block_z3_vars
                    ]  # for the conditional constraints

    block_3 = {'b3_1': 'phi'}
    block_3_obj = SMT_Block(block_3, thresh)
    values.extend(block_3_obj.block_values)
    block_3_vars = [ele.var for ele in block_3_obj.block_z3_vars
                    ]  # for the conditional constraints

    # all block objects
    block_objs = [block_1_obj, block_2_obj, block_3_obj]

    X = [ele.var for ele in block_1_obj.block_z3_vars
         ]  # added the variables for block 1
    X.append(c1)  # added the conditional variable
    X.extend([ele.var for ele in block_2_obj.block_z3_vars
              ])  # added the variables for block 2
    X.extend([ele.var for ele in block_3_obj.block_z3_vars
              ])  # added the variables for block 3

    constraints = block_1_obj.block_append_constraints + block_1_obj.flip_turns_constraints + block_1_obj.block_elimination_constraints + \
                  block_2_obj.block_append_constraints + block_2_obj.flip_turns_constraints + block_2_obj.block_elimination_constraints + \
                  block_3_obj.block_append_constraints + block_3_obj.flip_turns_constraints + block_3_obj.block_elimination_constraints

    single_block_change_cons = single_block_change(block_objs)

    constraints.extend(single_block_change_cons)

    constraints.extend([

        # conditional constraints: if(path_left)
        z3.Implies(c1 == 8, z3.Or(block_2_vars[0] == 2, block_2_vars[1] == 2,
                                  block_2_vars[2] == 2, block_2_vars[3] == 2,
                                  block_2_vars[4] == 2,

                                  )),
        z3.Implies(z3.And(c1 == 8, block_2_vars[1] == 2, block_2_vars[0] != 2), z3.And(block_2_vars[0] != 1, block_2_vars[0] != 3 )),
        z3.Implies(z3.And(c1 == 8, block_2_vars[2] == 2, block_2_vars[0] != 2, block_2_vars[1] != 2),
                   z3.And(block_2_vars[0] != 1, block_2_vars[0] != 3, block_2_vars[1] != 1, block_2_vars[1] != 3)),
        z3.Implies(z3.And(c1 == 8, block_2_vars[3] == 2, block_2_vars[0] != 2,
                          block_2_vars[1] != 2, block_2_vars[2] != 2), z3.And(block_2_vars[0] != 1, block_2_vars[0] != 3, block_2_vars[1] != 1, \
                                                                 block_2_vars[1] != 3, block_2_vars[2] != 1, block_2_vars[2] != 3)),
        z3.Implies(z3.And(c1 == 8, block_2_vars[4] == 2, block_2_vars[0] != 2,
                          block_2_vars[1] != 2, block_2_vars[2] != 2, block_2_vars[3] != 2), z3.And(block_2_vars[0] != 1, block_2_vars[0] != 3,
                                                                 block_2_vars[1] != 1, block_2_vars[1] != 3,
                                                                 block_2_vars[2] != 1, block_2_vars[2] != 3,
                                                                 block_2_vars[3] != 1, block_2_vars[3] != 3)),



        # conditional constraints: if(path_right)
        z3.Implies(c1 == 9, z3.Or(block_2_vars[0] == 3, block_2_vars[1] == 3,
                                  block_2_vars[2] == 3, block_2_vars[3] == 3,
                                  block_2_vars[4] == 3,

                                  )),
        z3.Implies(z3.And(c1 == 9, block_2_vars[1] == 3, block_2_vars[0] != 3,
                          ), z3.And(block_2_vars[0] != 1, block_2_vars[0] != 2)),
        z3.Implies(z3.And(c1 == 9, block_2_vars[2] == 3, block_2_vars[0] != 3,
                          block_2_vars[1] != 3), z3.And(block_2_vars[0]!= 1, block_2_vars[0] != 2,
                                                                 block_2_vars[1] != 1, block_2_vars[1] != 2)),
        z3.Implies(z3.And(c1 == 9, block_2_vars[3] == 3, block_2_vars[0] != 3,
                          block_2_vars[1] != 3, block_2_vars[2] != 3),
                   z3.And(block_2_vars[0] != 1, block_2_vars[0] != 2,
                          block_2_vars[1] != 1, block_2_vars[1] != 2,
                          block_2_vars[2] != 1, block_2_vars[2] != 2)),
        z3.Implies(z3.And(c1 == 9, block_2_vars[4] == 3, block_2_vars[0] != 3,
                          block_2_vars[1] != 3, block_2_vars[2] != 3, block_2_vars[3] != 3 ),
                   z3.And(block_2_vars[0] != 1, block_2_vars[0] != 2,
                          block_2_vars[1] != 1, block_2_vars[1] != 2,
                          block_2_vars[2] != 1, block_2_vars[2] != 2,
                          block_2_vars[3] != 1, block_2_vars[3] != 2)),

    ])

    # add the values and the constraints
    solver.add(values + constraints)

    # generate all the assignments
    models = gen_all(solver, X)
    assignments = []
    for model in models:
        a = ['repeat_until_goal(bool_goal)']
        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in X[:block_1_obj.size]
        ])

        a.append(type_to_str[ConditionalType(model[c1].as_long())])

        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in X[block_1_obj.size + 1:]
        ])

        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_3_vars
        ])
        assignments.append(a)
        #print(a)

    #print('Found #{} SAT values'.format(len(models)))
    return assignments
Exemplo n.º 14
0
 def exe_with_path_condition(self,
                             instruction: Instruction,
                             path_condition: list = []) -> PcPointer:
     self._update_all_ref_tracker(instruction)
     if instruction.opcode == "SSTORE":
         # save the value of every referred storage variable before SSTORE
         bak = {}
         for ref in self.reentrancy_references:
             bak[ref] = self._storage[ref.storage_addr]
     if instruction.opcode == "SSTORE" and self.pre_process:
         op0 = self._stack[-1]
         # 在可信条件下进行修改的Storage变量仍然是可信的(immutable)
         caller = z3.Int("Is")
         solver = z3.Solver()
         solver.add(path_condition)
         if "sat" == str(solver.check()):
             for storage_addr, storage_value in self._storage.get_storage(
             ).items():
                 if not utils.in_list(self.mutable_storage_addresses,
                                      storage_addr):
                     # solver.add(caller & 0xffffffffffffffffffff != storage_value & 0xffffffffffffffffffff)
                     mask = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff
                     if utils.is_symbol(storage_value):
                         # solver.add(z3.Int(str("Is") + "&" + str(mask)) != z3.Int(str(storage_value) + "&" + str(mask)))
                         # solver.add(z3.Int(str(mask) + "&" + str("Is")) != z3.Int(str(storage_value) + "&" + str(mask)))
                         # solver.add(z3.Int(str("Is") + "&" + str(mask)) != z3.Int(str(mask) + "&" + str(storage_value)))
                         # solver.add(z3.Int(str(mask) + "&" + str("Is")) != z3.Int(str(mask) + "&" + str(storage_value)))
                         # solver.add(z3.Int(str("Is")) != z3.Int(str(storage_value)))
                         solver.add(
                             z3.Int(str("Is")) != z3.Int(str(storage_value))
                         )
                     else:
                         # solver.add(z3.Int(str("Is") + "&" + str(mask)) != storage_value & mask)
                         # solver.add(z3.Int(str(mask) + "&" + str("Is")) != storage_value & mask)
                         solver.add(
                             z3.Int(str("Is")) != storage_value & mask)
             if "sat" == str(solver.check()):
                 # caller不为任意一个可信storage变量的时候仍然可能进行SSTORE,则说明被修改的storage变量是不可靠的
                 if not utils.in_list(self.mutable_storage_addresses, op0):
                     self.mutable_storage_addresses.append(op0)
     pc_pointer = super().exe(instruction)
     if instruction.opcode == "SSTORE":
         # check if any referred storage variable is changed after SSTORE
         # if len(bak) != len(self._storage):
         #     # 如果新增了Storage变量,那么一定是做修改了
         #     ref.storage_changed = True
         #     if ref.after_used_in_condition:
         #         ref.changed_after_condition = True
         #     if not ref.after_call:
         #         ref.changed_before_call = True
         # else:
         # 如果Storage变量的个数没变,那么就检查每一个变量的值有没有改变
         for ref, value in bak.items():
             if utils.is_symbol(value) is not utils.is_symbol(self._storage[ref.storage_addr]) or \
                     utils.is_symbol(value) and not eq(simplify(value),
                                                       simplify(self._storage[ref.storage_addr])) or \
                     not utils.is_symbol(value) and value != self._storage[ref.storage_addr]:
                 ref.storage_changed = True
                 if ref.after_used_in_condition:
                     ref.changed_after_condition = True
                 if not ref.after_call:
                     ref.changed_before_call = True
     return pc_pointer
def generate_assignments(thresh=2, id='karel'):
    solver = z3.Solver()
    # declare the SMT variables for the specific code
    # Block 1

    block_1 = {'b1_1': 'put_marker'}
    block_1_obj = SMT_Block(block_1, thresh, id=id)
    values = block_1_obj.block_values
    block_1_vars = [ele.var for ele in block_1_obj.block_z3_vars
                    ]  # for the conditional constraints

    c1 = z3.Int('c1')  # bool_path_ahead (while)
    values.append(z3.Or(c1 == 7,
                        c1 == 12))  # bool_path_ahead, bool_no_path_ahead

    block_2 = {
        'b2_1': 'move',
        'b2_2': 'turn_left',
        'b2_3': 'move',
        'b2_4': 'turn_right',
        'b2_5': 'put_marker'
    }
    block_2_obj = SMT_Block(block_2, thresh, id=id)
    values.extend(block_2_obj.block_values)
    block_2_vars = [ele.var for ele in block_2_obj.block_z3_vars
                    ]  # for the conditional constraints

    block_3 = {'b3_1': 'phi'}
    block_3_obj = SMT_Block(block_3, thresh, id=id)
    values.extend(block_3_obj.block_values)
    block_3_vars = [ele.var for ele in block_3_obj.block_z3_vars
                    ]  # for the conditional constraints

    # all block objects
    block_objs = [block_1_obj, block_2_obj, block_3_obj]

    X = [c1]
    X.extend([ele.var for ele in block_1_obj.block_z3_vars
              ])  # added the variables for block 1
    X.extend([ele.var for ele in block_2_obj.block_z3_vars
              ])  # added the variables for block 2
    X.extend([ele.var for ele in block_3_obj.block_z3_vars
              ])  # added the variables for block 3



    constraints = block_1_obj.block_append_constraints + block_1_obj.flip_turns_constraints + block_1_obj.flip_marker_constraints+ \
                  block_1_obj.block_elimination_constraints + \
                  block_2_obj.block_append_constraints + block_2_obj.flip_turns_constraints + \
                  block_2_obj.flip_marker_constraints + block_2_obj.block_elimination_constraints +\
                  block_3_obj.block_append_constraints + block_3_obj.flip_turns_constraints + \
                  block_3_obj.flip_marker_constraints + block_3_obj.block_elimination_constraints

    single_block_change_cons = single_block_change(block_objs)

    constraints.extend(single_block_change_cons)

    constraints.extend([

        # conditional constraints: while(bool_path_ahead)---while block constraints
        z3.Implies(
            c1 == 7,
            z3.Or(
                block_2_vars[0] == 1,
                block_2_vars[1] == 1,
                block_2_vars[2] == 1,
                block_2_vars[3] == 1,
                block_2_vars[4] == 1,
                block_2_vars[5] == 1,
                block_2_vars[6] == 1,
                block_2_vars[7] == 1,
                block_2_vars[8] == 1,
                block_2_vars[9] == 1,
                block_2_vars[10] == 1,
                block_2_vars[11] == 1,
                block_2_vars[12] == 1,
            )),
        z3.Implies(z3.And(c1 == 7, block_2_vars[1] == 1, block_2_vars[0] != 1),
                   z3.And(block_2_vars[0] != 2, block_2_vars[0] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[2] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1),
            z3.And(block_2_vars[0] != 2, block_2_vars[0] != 3,
                   block_2_vars[1] != 2, block_2_vars[1] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[3] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1),
            z3.And(block_2_vars[0] != 2, block_2_vars[0] != 3,
                   block_2_vars[1] != 2, block_2_vars[1] != 3,
                   block_2_vars[2] != 2, block_2_vars[2] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[4] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1),
            z3.And(block_2_vars[0] != 2, block_2_vars[0] != 3,
                   block_2_vars[1] != 2, block_2_vars[1] != 3,
                   block_2_vars[2] != 2, block_2_vars[2] != 3,
                   block_2_vars[3] != 2, block_2_vars[3] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[5] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1),
            z3.And(block_2_vars[0] != 2, block_2_vars[0] != 3,
                   block_2_vars[1] != 2, block_2_vars[1] != 3,
                   block_2_vars[2] != 2, block_2_vars[2] != 3,
                   block_2_vars[3] != 2, block_2_vars[3] != 3,
                   block_2_vars[4] != 2, block_2_vars[4] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[6] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1),
            z3.And(block_2_vars[0] != 2, block_2_vars[0] != 3,
                   block_2_vars[1] != 2, block_2_vars[1] != 3,
                   block_2_vars[2] != 2, block_2_vars[2] != 3,
                   block_2_vars[3] != 2, block_2_vars[3] != 3,
                   block_2_vars[4] != 2, block_2_vars[4] != 3,
                   block_2_vars[5] != 2, block_2_vars[5] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[7] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1, block_2_vars[6] != 1),
            z3.And(block_2_vars[0] != 2, block_2_vars[0] != 3,
                   block_2_vars[1] != 2, block_2_vars[1] != 3,
                   block_2_vars[2] != 2, block_2_vars[2] != 3,
                   block_2_vars[3] != 2, block_2_vars[3] != 3,
                   block_2_vars[4] != 2, block_2_vars[4] != 3,
                   block_2_vars[5] != 2, block_2_vars[5] != 3,
                   block_2_vars[6] != 2, block_2_vars[6] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[8] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1, block_2_vars[6] != 1,
                   block_2_vars[7] != 1),
            z3.And(block_2_vars[0] != 2, block_2_vars[0] != 3,
                   block_2_vars[1] != 2, block_2_vars[1] != 3,
                   block_2_vars[2] != 2, block_2_vars[2] != 3,
                   block_2_vars[3] != 2, block_2_vars[3] != 3,
                   block_2_vars[4] != 2, block_2_vars[4] != 3,
                   block_2_vars[5] != 2, block_2_vars[5] != 3,
                   block_2_vars[6] != 2, block_2_vars[6] != 3,
                   block_2_vars[7] != 2, block_2_vars[7] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[9] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1, block_2_vars[6] != 1,
                   block_2_vars[7] != 1, block_2_vars[8] != 1),
            z3.And(block_2_vars[0] != 2, block_2_vars[0] != 3,
                   block_2_vars[1] != 2, block_2_vars[1] != 3,
                   block_2_vars[2] != 2, block_2_vars[2] != 3,
                   block_2_vars[3] != 2, block_2_vars[3] != 3,
                   block_2_vars[4] != 2, block_2_vars[4] != 3,
                   block_2_vars[5] != 2, block_2_vars[5] != 3,
                   block_2_vars[6] != 2, block_2_vars[6] != 3,
                   block_2_vars[7] != 2, block_2_vars[7] != 3,
                   block_2_vars[8] != 2, block_2_vars[8] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[10] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1, block_2_vars[6] != 1,
                   block_2_vars[7] != 1, block_2_vars[8] != 1,
                   block_2_vars[9] != 1),
            z3.And(block_2_vars[0] != 2, block_2_vars[0] != 3,
                   block_2_vars[1] != 2, block_2_vars[1] != 3,
                   block_2_vars[2] != 2, block_2_vars[2] != 3,
                   block_2_vars[3] != 2, block_2_vars[3] != 3,
                   block_2_vars[4] != 2, block_2_vars[4] != 3,
                   block_2_vars[5] != 2, block_2_vars[5] != 3,
                   block_2_vars[6] != 2, block_2_vars[6] != 3,
                   block_2_vars[7] != 2, block_2_vars[7] != 3,
                   block_2_vars[8] != 2, block_2_vars[8] != 3,
                   block_2_vars[9] != 2, block_2_vars[9] != 3)),

        # # ################################################ THRESH = 2
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[11] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1, block_2_vars[6] != 1,
                   block_2_vars[7] != 1, block_2_vars[8] != 1,
                   block_2_vars[9] != 1, block_2_vars[10] != 1),
            z3.And(block_2_vars[0] != 2, block_2_vars[0] != 3,
                   block_2_vars[1] != 2, block_2_vars[1] != 3,
                   block_2_vars[2] != 2, block_2_vars[2] != 3,
                   block_2_vars[3] != 2, block_2_vars[3] != 3,
                   block_2_vars[4] != 2, block_2_vars[4] != 3,
                   block_2_vars[5] != 2, block_2_vars[5] != 3,
                   block_2_vars[6] != 2, block_2_vars[6] != 3,
                   block_2_vars[7] != 2, block_2_vars[7] != 3,
                   block_2_vars[8] != 2, block_2_vars[8] != 3,
                   block_2_vars[9] != 2, block_2_vars[9] != 3,
                   block_2_vars[10] != 2, block_2_vars[10] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[12] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1, block_2_vars[6] != 1,
                   block_2_vars[7] != 1, block_2_vars[8] != 1,
                   block_2_vars[9] != 1, block_2_vars[10] != 1,
                   block_2_vars[11] != 1),
            z3.And(block_2_vars[0] != 2, block_2_vars[0] != 3,
                   block_2_vars[1] != 2, block_2_vars[1] != 3,
                   block_2_vars[2] != 2, block_2_vars[2] != 3,
                   block_2_vars[3] != 2, block_2_vars[3] != 3,
                   block_2_vars[4] != 2, block_2_vars[4] != 3,
                   block_2_vars[5] != 2, block_2_vars[5] != 3,
                   block_2_vars[6] != 2, block_2_vars[6] != 3,
                   block_2_vars[7] != 2, block_2_vars[7] != 3,
                   block_2_vars[8] != 2, block_2_vars[8] != 3,
                   block_2_vars[9] != 2, block_2_vars[9] != 3,
                   block_2_vars[10] != 2, block_2_vars[10] != 3,
                   block_2_vars[11] != 2, block_2_vars[11] != 3)),

        # # conditional constraints: while(bool_no_path_ahead)---while block constraints
        z3.Implies(c1 == 12, block_2_vars[0] != 1),
        z3.Implies(
            z3.And(c1 == 12, block_2_vars[1] == 1, block_2_vars[0] != 1),
            z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3)),
        z3.Implies(
            z3.And(c1 == 12, block_2_vars[2] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1),
            z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3,
                  block_2_vars[1] == 2, block_2_vars[1] == 3)),
        z3.Implies(
            z3.And(c1 == 12, block_2_vars[3] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1),
            z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3,
                  block_2_vars[1] == 2, block_2_vars[1] == 3,
                  block_2_vars[2] == 2, block_2_vars[2] == 3)),
        z3.Implies(
            z3.And(c1 == 12, block_2_vars[4] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1),
            z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3,
                  block_2_vars[1] == 2, block_2_vars[1] == 3,
                  block_2_vars[2] == 2, block_2_vars[2] == 3,
                  block_2_vars[3] == 2, block_2_vars[3] == 3)),
        z3.Implies(
            z3.And(c1 == 12, block_2_vars[5] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1),
            z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3,
                  block_2_vars[1] == 2, block_2_vars[1] == 3,
                  block_2_vars[2] == 2, block_2_vars[2] == 3,
                  block_2_vars[3] == 2, block_2_vars[3] == 3,
                  block_2_vars[4] == 2, block_2_vars[4] == 3)),
        z3.Implies(
            z3.And(c1 == 12, block_2_vars[6] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1),
            z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3,
                  block_2_vars[1] == 2, block_2_vars[1] == 3,
                  block_2_vars[2] == 2, block_2_vars[2] == 3,
                  block_2_vars[3] == 2, block_2_vars[3] == 3,
                  block_2_vars[4] == 2, block_2_vars[4] == 3,
                  block_2_vars[5] == 2, block_2_vars[5] == 3)),
        z3.Implies(
            z3.And(c1 == 12, block_2_vars[7] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1, block_2_vars[6] != 1),
            z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3,
                  block_2_vars[1] == 2, block_2_vars[1] == 3,
                  block_2_vars[2] == 2, block_2_vars[2] == 3,
                  block_2_vars[3] == 2, block_2_vars[3] == 3,
                  block_2_vars[4] == 2, block_2_vars[4] == 3,
                  block_2_vars[5] == 2, block_2_vars[5] == 3,
                  block_2_vars[6] == 2, block_2_vars[6] == 3)),
        z3.Implies(
            z3.And(c1 == 12, block_2_vars[8] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1, block_2_vars[6] != 1,
                   block_2_vars[7] != 1),
            z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3,
                  block_2_vars[1] == 2, block_2_vars[1] == 3,
                  block_2_vars[2] == 2, block_2_vars[2] == 3,
                  block_2_vars[3] == 2, block_2_vars[3] == 3,
                  block_2_vars[4] == 2, block_2_vars[4] == 3,
                  block_2_vars[5] == 2, block_2_vars[5] == 3,
                  block_2_vars[6] == 2, block_2_vars[6] == 3,
                  block_2_vars[7] == 2, block_2_vars[7] == 3)),
        z3.Implies(
            z3.And(c1 == 12, block_2_vars[9] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1, block_2_vars[6] != 1,
                   block_2_vars[7] != 1, block_2_vars[8] != 1),
            z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3,
                  block_2_vars[1] == 2, block_2_vars[1] == 3,
                  block_2_vars[2] == 2, block_2_vars[2] == 3,
                  block_2_vars[3] == 2, block_2_vars[3] == 3,
                  block_2_vars[4] == 2, block_2_vars[4] == 3,
                  block_2_vars[5] == 2, block_2_vars[5] == 3,
                  block_2_vars[6] == 2, block_2_vars[6] == 3,
                  block_2_vars[7] == 2, block_2_vars[7] == 3,
                  block_2_vars[8] == 2, block_2_vars[8] == 3)),
        z3.Implies(
            z3.And(
                c1 == 12,
                block_2_vars[10] == 1,
                block_2_vars[0] != 1,
                block_2_vars[1] != 1,
                block_2_vars[2] != 1,
                block_2_vars[3] != 1,
                block_2_vars[4] != 1,
                block_2_vars[5] != 1,
                block_2_vars[6] != 1,
                block_2_vars[7] != 1,
                block_2_vars[8] != 1,
                block_2_vars[9] != 1,
            ),
            z3.Or(
                block_2_vars[0] == 2,
                block_2_vars[0] == 3,
                block_2_vars[1] == 2,
                block_2_vars[1] == 3,
                block_2_vars[2] == 2,
                block_2_vars[2] == 3,
                block_2_vars[3] == 2,
                block_2_vars[3] == 3,
                block_2_vars[4] == 2,
                block_2_vars[4] == 3,
                block_2_vars[5] == 2,
                block_2_vars[5] == 3,
                block_2_vars[6] == 2,
                block_2_vars[6] == 3,
                block_2_vars[7] == 2,
                block_2_vars[7] == 3,
                block_2_vars[8] == 2,
                block_2_vars[8] == 3,
                block_2_vars[9] == 2,
                block_2_vars[9] == 3,
            )),
        z3.Implies(
            z3.And(c1 == 12, block_2_vars[11] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1, block_2_vars[6] != 1,
                   block_2_vars[7] != 1, block_2_vars[8] != 1,
                   block_2_vars[9] != 1, block_2_vars[10] != 1),
            z3.Or(
                block_2_vars[0] == 2,
                block_2_vars[0] == 3,
                block_2_vars[1] == 2,
                block_2_vars[1] == 3,
                block_2_vars[2] == 2,
                block_2_vars[2] == 3,
                block_2_vars[3] == 2,
                block_2_vars[3] == 3,
                block_2_vars[4] == 2,
                block_2_vars[4] == 3,
                block_2_vars[5] == 2,
                block_2_vars[5] == 3,
                block_2_vars[6] == 2,
                block_2_vars[6] == 3,
                block_2_vars[7] == 2,
                block_2_vars[7] == 3,
                block_2_vars[8] == 2,
                block_2_vars[8] == 3,
                block_2_vars[9] == 2,
                block_2_vars[9] == 3,
                block_2_vars[10] == 2,
                block_2_vars[10] == 3,
            )),
        z3.Implies(
            z3.And(c1 == 12, block_2_vars[12] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1, block_2_vars[4] != 1,
                   block_2_vars[5] != 1, block_2_vars[6] != 1,
                   block_2_vars[7] != 1, block_2_vars[8] != 1,
                   block_2_vars[9] != 1, block_2_vars[10] != 1,
                   block_2_vars[11] != 1),
            z3.Or(
                block_2_vars[0] == 2,
                block_2_vars[0] == 3,
                block_2_vars[1] == 2,
                block_2_vars[1] == 3,
                block_2_vars[2] == 2,
                block_2_vars[2] == 3,
                block_2_vars[3] == 2,
                block_2_vars[3] == 3,
                block_2_vars[4] == 2,
                block_2_vars[4] == 3,
                block_2_vars[5] == 2,
                block_2_vars[5] == 3,
                block_2_vars[6] == 2,
                block_2_vars[6] == 3,
                block_2_vars[7] == 2,
                block_2_vars[7] == 3,
                block_2_vars[8] == 2,
                block_2_vars[8] == 3,
                block_2_vars[9] == 2,
                block_2_vars[9] == 3,
                block_2_vars[10] == 2,
                block_2_vars[10] == 3,
                block_2_vars[11] == 2,
                block_2_vars[11] == 3,
            )),
    ])

    # add the values and the constraints
    solver.add(values + constraints)

    # generate all the assignments
    models = gen_all(solver, X)

    assignments = []
    for model in models:

        a = [
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_1_vars
        ]

        a.append(type_to_str[ConditionalType(model[c1].as_long())])

        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_2_vars
        ])
        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_3_vars
        ])

        assignments.append(a)
        #print(a)

    #print('Found #{} SAT values'.format(len(models)))
    return assignments
def generate_assignments(thresh = 2, id = 'karel'):

    # create the initial z3 solver
    solver = z3.Solver()
    # declare a block
    block_1 = {'b1_1': 'put_marker', 'b1_2': 'move', 'b1_3': 'turn_left'}

    block_1_obj = SMT_Block(block_1, thresh, id =id )

    values = block_1_obj.block_values

    c1 = z3.Int('c1')  # 4 (repeat)
    values.append(

        z3.Or(c1 == 3, c1 == 4, c1 == 5),

    )

    # declare a block
    block_2 = {'b2_1': 'phi'}

    block_2_obj = SMT_Block(block_2, thresh, id=id)

    values.extend(block_2_obj.block_values)

    # declare a block
    block_3 = {'b3_1': 'phi'}

    block_3_obj = SMT_Block(block_3, thresh, id=id)

    values.extend(block_3_obj.block_values)

    block_objs = [block_1_obj, block_2_obj, block_3_obj]

    # declare the values that each of the variables can take
    X = [ele.var for ele in block_1_obj.block_z3_vars]
    X.append(c1)
    X.extend([ele.var for ele in block_2_obj.block_z3_vars])
    X.extend([ele.var for ele in block_3_obj.block_z3_vars])


    constraints = block_1_obj.block_append_constraints + block_1_obj.flip_turns_constraints + \
                  block_1_obj.flip_marker_constraints + block_1_obj.block_elimination_constraints + \
                  block_2_obj.block_append_constraints + block_2_obj.flip_turns_constraints + \
                  block_2_obj.flip_marker_constraints + block_2_obj.block_elimination_constraints + \
                  block_3_obj.block_append_constraints + block_3_obj.flip_turns_constraints + \
                  block_3_obj.flip_marker_constraints + block_3_obj.block_elimination_constraints


    single_block_change_cons = single_block_change(block_objs)

    constraints.extend(single_block_change_cons)

    # add the values and the constraints
    solver.add(values + constraints)

    # generate all the assignments
    models = gen_all(solver, X)
    assignments = []
    for model in models:
        a = [str(model[c1].as_long())]
        a.extend([type_to_str[VariableType(model[ele.var].as_long())]
            for ele in block_1_obj.block_z3_vars
             ])

        a.extend([type_to_str[VariableType(model[ele.var].as_long())]
                  for ele in block_2_obj.block_z3_vars
                  ])

        a.extend([type_to_str[VariableType(model[ele.var].as_long())]
                  for ele in block_3_obj.block_z3_vars
                  ])



        assignments.append(a)
        #print(a)



    #print('Found #{} SAT values'.format(len(models)))
    return assignments
Exemplo n.º 17
0
def generate_assignments(thresh=2):
    solver = z3.Solver()
    # declare the SMT variables for the specific code
    # Block 1
    block_1 = {'b1_1': 'move'}
    block_1_obj = SMT_Block(block_1, thresh)
    values = block_1_obj.block_values
    block_1_vars = [ele.var for ele in block_1_obj.block_z3_vars
                    ]  # for the conditional constraints

    c1 = z3.Int('c1')  # bool_path_ahead (if_else)

    block_2 = {'b2_1': 'turn_left'}
    block_2_obj = SMT_Block(block_2, thresh)
    values.extend(block_2_obj.block_values)
    block_2_vars = [ele.var for ele in block_2_obj.block_z3_vars
                    ]  # for the conditional constraints

    values.append(c1 == 7)  # same conditional value

    block_3 = {'b3_1': 'phi'}
    block_3_obj = SMT_Block(block_3, thresh)
    values.extend(block_3_obj.block_values)
    block_3_vars = [ele.var for ele in block_3_obj.block_z3_vars
                    ]  # for the conditional constraints

    # all block objects
    block_objs = [block_1_obj, block_2_obj, block_3_obj]

    X = [c1]
    X.extend([ele.var for ele in block_1_obj.block_z3_vars
              ])  # added the variables for block 1
    X.extend([ele.var for ele in block_2_obj.block_z3_vars
              ])  # added the variables for block 2
    X.extend([ele.var for ele in block_3_obj.block_z3_vars
              ])  # added the variables for block 2


    constraints = block_1_obj.block_append_constraints + block_1_obj.flip_turns_constraints + block_1_obj.block_elimination_constraints + \
                  block_2_obj.block_append_constraints + block_2_obj.flip_turns_constraints + block_2_obj.block_elimination_constraints + \
                  block_3_obj.block_append_constraints + block_3_obj.flip_turns_constraints + block_3_obj.block_elimination_constraints

    single_block_change_cons = single_block_change(block_objs)

    constraints.extend(single_block_change_cons)

    constraints.extend([

        # conditional constraints: if_else(bool_path_ahead)---if block constraints
        z3.Implies(
            c1 == 7,
            z3.Or(
                block_1_vars[0] == 1,
                block_1_vars[1] == 1,
                block_1_vars[2] == 1,
                block_1_vars[3] == 1,
                block_1_vars[4] == 1,
            )),
        z3.Implies(z3.And(c1 == 7, block_1_vars[1] == 1, block_1_vars[0] != 1),
                   z3.And(block_1_vars[0] != 2, block_1_vars[0] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_1_vars[2] == 1, block_1_vars[0] != 1,
                   block_1_vars[1] != 1),
            z3.And(block_1_vars[0] != 2, block_1_vars[0] != 3,
                   block_1_vars[1] != 2, block_1_vars[1] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_1_vars[3] == 1, block_1_vars[0] != 1,
                   block_1_vars[1] != 1, block_1_vars[2] != 1),
            z3.And(block_1_vars[0] != 2, block_1_vars[0] != 3,
                   block_1_vars[1] != 2, block_1_vars[1] != 3,
                   block_1_vars[2] != 2, block_1_vars[2] != 3)),
        z3.Implies(
            z3.And(c1 == 7, block_1_vars[4] == 1, block_1_vars[0] != 1,
                   block_1_vars[1] != 1, block_1_vars[2] != 1,
                   block_1_vars[3] != 1),
            z3.And(block_1_vars[0] != 2, block_1_vars[0] != 3,
                   block_1_vars[1] != 2, block_1_vars[1] != 3,
                   block_1_vars[2] != 2, block_1_vars[2] != 3,
                   block_1_vars[3] != 2, block_1_vars[3] != 3)),

        # else block constraints
        z3.Implies(c1 == 7, block_2_vars[0] != 1),
        z3.Implies(z3.And(c1 == 7, block_2_vars[1] == 1, block_2_vars[0] != 1),
                   z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[2] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1),
            z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3,
                  block_2_vars[1] == 2, block_2_vars[1] == 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[3] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1),
            z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3,
                  block_2_vars[1] == 2, block_2_vars[1] == 3,
                  block_2_vars[2] == 2, block_2_vars[2] == 3)),
        z3.Implies(
            z3.And(c1 == 7, block_2_vars[4] == 1, block_2_vars[0] != 1,
                   block_2_vars[1] != 1, block_2_vars[2] != 1,
                   block_2_vars[3] != 1),
            z3.Or(block_2_vars[0] == 2, block_2_vars[0] == 3,
                  block_2_vars[1] == 2, block_2_vars[1] == 3,
                  block_2_vars[2] == 2, block_2_vars[2] == 3,
                  block_2_vars[3] == 2, block_2_vars[3] == 3)),
    ])

    unequal_blocks_con = block_unequal_constraint(block_1_obj, block_2_obj)
    constraints.extend(unequal_blocks_con)
    # add the values and the constraints
    solver.add(values + constraints)

    # generate all the assignments
    models = gen_all(solver, X)

    assignments = []
    for model in models:
        a = [
            'repeat_until_goal(bool_goal)',
            type_to_str[ConditionalType(model[c1].as_long())]
        ]

        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in X[1:block_1_obj.size + 1]
        ])

        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in X[block_1_obj.size + 1:block_2_obj.size +
                         block_1_obj.size + 1]
        ])

        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_3_vars
        ])

        assignments.append(a)
        #print(a)

    #print('Found #{} SAT values'.format(len(models)))
    return assignments
Exemplo n.º 18
0
def generate_assignments(thresh=2, id='karel'):
    solver = z3.Solver()
    # declare the SMT variables for the specific code
    # Block 1
    c0 = z3.Int('c0')  # repeat (8)
    c1 = z3.Int('c1')  # bool_no_marker (if_else)

    block_1 = {'b1_1': 'put_marker'}
    block_1_obj = SMT_Block(block_1, thresh, id=id)
    values = block_1_obj.block_values
    block_1_vars = [ele.var for ele in block_1_obj.block_z3_vars
                    ]  # for the conditional constraints

    block_2 = {'b2_1': 'pick_marker'}
    block_2_obj = SMT_Block(block_2, thresh, id=id)
    values.extend(block_2_obj.block_values)
    block_2_vars = [ele.var for ele in block_2_obj.block_z3_vars
                    ]  # for the conditional constraints

    values.append(z3.Or(c0 == 7, c0 == 8, c0 == 9))
    values.append(z3.Or(c1 == 10, c1 == 11))  # bool_no_marker, bool_marker

    block_3 = {'b3_1': 'move'}
    block_3_obj = SMT_Block(block_3, thresh, id=id)
    values.extend(block_3_obj.block_values)
    block_3_vars = [ele.var for ele in block_3_obj.block_z3_vars
                    ]  # for the conditional constraints

    block_4 = {'b4_1': 'phi'}
    block_4_obj = SMT_Block(block_4, thresh, id=id)
    values.extend(block_4_obj.block_values)
    block_4_vars = [ele.var for ele in block_4_obj.block_z3_vars
                    ]  # for the conditional constraints

    block_5 = {'b5_1': 'phi'}
    block_5_obj = SMT_Block(block_5, thresh, id=id)
    values.extend(block_5_obj.block_values)
    block_5_vars = [ele.var for ele in block_5_obj.block_z3_vars
                    ]  # for the conditional constraints

    # all block objects
    block_objs = [
        block_1_obj, block_2_obj, block_3_obj, block_4_obj, block_5_obj
    ]

    X = [c0, c1]
    X.extend([ele.var for ele in block_1_obj.block_z3_vars
              ])  # added the variables for block 1
    X.extend([ele.var for ele in block_2_obj.block_z3_vars
              ])  # added the variables for block 2
    X.extend([ele.var for ele in block_3_obj.block_z3_vars
              ])  # added the variables for block 3
    X.extend([ele.var for ele in block_4_obj.block_z3_vars
              ])  # added the variables for block 4
    X.extend([ele.var for ele in block_5_obj.block_z3_vars
              ])  # added the variables for block 5



    constraints = block_1_obj.block_append_constraints + block_1_obj.flip_turns_constraints + block_1_obj.flip_marker_constraints+ \
                  block_1_obj.block_elimination_constraints + \
                  block_2_obj.block_append_constraints + block_2_obj.flip_turns_constraints + \
                  block_2_obj.flip_marker_constraints+block_2_obj.block_elimination_constraints + \
                  block_3_obj.block_append_constraints + block_3_obj.flip_turns_constraints + \
                  block_3_obj.flip_marker_constraints+block_3_obj.block_elimination_constraints + \
                  block_4_obj.block_append_constraints + block_4_obj.flip_turns_constraints + \
                  block_4_obj.flip_marker_constraints + block_4_obj.block_elimination_constraints + \
                  block_5_obj.block_append_constraints + block_5_obj.flip_turns_constraints + \
                  block_5_obj.flip_marker_constraints + block_5_obj.block_elimination_constraints

    single_block_change_cons = single_block_change(block_objs)

    constraints.extend(single_block_change_cons)

    constraints.extend([

        # conditional constraints: if_else(bool_no_marker)---if block constraints
        z3.Implies(c1 == 11, block_1_vars[0] != 4),
        z3.Implies(
            z3.And(c1 == 11, block_1_vars[1] == 4, block_1_vars[0] != 4),
            z3.Or(block_1_vars[0] == 1, block_1_vars[0] == 5)),
        z3.Implies(
            z3.And(c1 == 11, block_1_vars[2] == 4, block_1_vars[0] != 4,
                   block_1_vars[1] != 4),
            z3.Or(block_1_vars[0] == 1, block_1_vars[0] == 5,
                  block_1_vars[1] == 1, block_1_vars[1] == 5)),
        z3.Implies(
            z3.And(c1 == 11, block_1_vars[3] == 4, block_1_vars[0] != 4,
                   block_1_vars[1] != 4, block_1_vars[2] != 4),
            z3.Or(block_1_vars[0] == 1, block_1_vars[0] == 5,
                  block_1_vars[1] == 1, block_1_vars[1] == 5,
                  block_1_vars[2] == 1, block_1_vars[2] == 5)),
        z3.Implies(
            z3.And(c1 == 11, block_1_vars[4] == 4, block_1_vars[0] != 4,
                   block_1_vars[1] != 4, block_1_vars[2] != 4,
                   block_1_vars[3] != 4),
            z3.And(block_1_vars[0] == 1, block_1_vars[0] == 5,
                   block_1_vars[1] == 1, block_1_vars[1] == 5,
                   block_1_vars[2] == 1, block_1_vars[2] == 5,
                   block_1_vars[3] == 1, block_1_vars[3] == 5)),

        # else block constraints
        z3.Implies(c1 == 11, block_2_vars[0] != 5),
        z3.Implies(
            z3.And(c1 == 11, block_2_vars[1] == 5, block_2_vars[0] != 5),
            z3.Or(block_2_vars[0] == 1, block_2_vars[0] == 4)),
        z3.Implies(
            z3.And(c1 == 11, block_2_vars[2] == 5, block_2_vars[0] != 5,
                   block_2_vars[1] != 5),
            z3.Or(block_2_vars[0] == 1, block_2_vars[0] == 4,
                  block_2_vars[1] == 1, block_2_vars[1] == 4)),
        z3.Implies(
            z3.And(c1 == 11, block_2_vars[3] == 5, block_2_vars[0] != 5,
                   block_2_vars[1] != 5, block_2_vars[2] != 5),
            z3.Or(block_2_vars[0] == 1, block_2_vars[0] == 4,
                  block_2_vars[1] == 1, block_2_vars[1] == 4,
                  block_2_vars[2] == 1, block_2_vars[2] == 4)),
        z3.Implies(
            z3.And(c1 == 11, block_2_vars[4] == 5, block_2_vars[0] != 5,
                   block_2_vars[1] != 5, block_2_vars[2] != 5,
                   block_2_vars[3] != 5),
            z3.And(block_2_vars[0] == 1, block_2_vars[0] == 4,
                   block_2_vars[1] == 1, block_2_vars[1] == 4,
                   block_2_vars[2] == 1, block_2_vars[2] == 4,
                   block_2_vars[3] == 1, block_2_vars[3] == 4)),

        # conditional constraints: if_else(bool_marker)---if block constraints
        z3.Implies(c1 == 10, block_1_vars[0] != 5),
        z3.Implies(
            z3.And(c1 == 10, block_1_vars[1] == 5, block_1_vars[0] != 5),
            z3.Or(block_1_vars[0] == 1, block_1_vars[0] == 4)),
        z3.Implies(
            z3.And(c1 == 10, block_1_vars[2] == 5, block_1_vars[0] != 5,
                   block_1_vars[1] != 5),
            z3.Or(block_1_vars[0] == 1, block_1_vars[0] == 4,
                  block_1_vars[1] == 1, block_1_vars[1] == 4)),
        z3.Implies(
            z3.And(c1 == 10, block_1_vars[3] == 5, block_1_vars[0] != 5,
                   block_1_vars[1] != 5, block_1_vars[2] != 5),
            z3.Or(block_1_vars[0] == 1, block_1_vars[0] == 4,
                  block_1_vars[1] == 1, block_1_vars[1] == 4,
                  block_1_vars[2] == 1, block_1_vars[2] == 4)),
        z3.Implies(
            z3.And(c1 == 10, block_1_vars[4] == 5, block_1_vars[0] != 5,
                   block_1_vars[1] != 5, block_1_vars[2] != 5,
                   block_1_vars[3] != 5),
            z3.And(block_1_vars[0] == 1, block_1_vars[0] == 4,
                   block_1_vars[1] == 1, block_1_vars[1] == 4,
                   block_1_vars[2] == 1, block_1_vars[2] == 4,
                   block_1_vars[3] == 1, block_1_vars[3] == 4)),

        # else block constraints
        z3.Implies(c1 == 10, block_2_vars[0] != 4),
        z3.Implies(
            z3.And(c1 == 10, block_2_vars[1] == 4, block_2_vars[0] != 4),
            z3.Or(block_2_vars[0] == 1, block_2_vars[0] == 5)),
        z3.Implies(
            z3.And(c1 == 10, block_2_vars[2] == 4, block_2_vars[0] != 4,
                   block_2_vars[1] != 4),
            z3.Or(block_2_vars[0] == 1, block_2_vars[0] == 5,
                  block_2_vars[1] == 1, block_2_vars[1] == 5)),
        z3.Implies(
            z3.And(c1 == 10, block_2_vars[3] == 4, block_2_vars[0] != 4,
                   block_2_vars[1] != 4, block_2_vars[2] != 4),
            z3.Or(block_2_vars[0] == 1, block_2_vars[0] == 5,
                  block_2_vars[1] == 1, block_2_vars[1] == 5,
                  block_2_vars[2] == 1, block_2_vars[2] == 5)),
        z3.Implies(
            z3.And(c1 == 10, block_2_vars[4] == 4, block_2_vars[0] != 4,
                   block_2_vars[1] != 4, block_2_vars[2] != 4,
                   block_2_vars[3] != 4),
            z3.And(block_2_vars[0] == 1, block_2_vars[0] == 5,
                   block_2_vars[1] == 1, block_2_vars[1] == 5,
                   block_2_vars[2] == 1, block_2_vars[2] == 5,
                   block_2_vars[3] == 1, block_2_vars[3] == 5)),
    ])

    unequal_blocks_con = block_unequal_constraint(block_1_obj, block_2_obj)
    constraints.extend(unequal_blocks_con)
    # add the values and the constraints
    solver.add(values + constraints)

    # generate all the assignments
    models = gen_all(solver, X)

    assignments = []
    for model in models:
        a = [
            str(model[c0].as_long()),
            type_to_str[ConditionalType(model[c1].as_long())]
        ]

        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_1_vars
        ])

        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_2_vars
        ])
        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_3_vars
        ])
        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_4_vars
        ])
        a.extend([
            type_to_str[VariableType(model[ele].as_long())]
            for ele in block_5_vars
        ])

        assignments.append(a)
        #print(a)

    #print('Found #{} SAT values'.format(len(models)))
    return assignments
Exemplo n.º 19
0
            CurrStr = translator.toString(Curr)
            # SynFunResult = FuncDefine+Curr
            # Str = translator.toString(SynFunResult)
            Str = FuncDefineStr[:-1] + ' ' + CurrStr + FuncDefineStr[
                -1]  # insert Program just before the last bracket ')'
            Count += 1
            # print (Count)
            print(Str)
            # if Count % 100 == 1:
            # print (Count)
            # print (Str)
            # raw_input()
            # print '1'
            counterexample = checker.check(Str)
            # print counterexample
            print(int(str(counterexample.eval(z3.Int('x'), True))))
            print(int(str(counterexample.eval(z3.Int('y'), True))))
            if (counterexample == None):  # No counter-example
                Ans = Str
                break
            # print '2'
        # print(TryExtend)
        # raw_input()
        # BfsQueue+=TryExtend

        for TE in TryExtend:
            TE_str = str(TE)
            if not TE_str in TE_set:
                BfsQueue.append(TE)
                TE_set.add(TE_str)
Exemplo n.º 20
0
    def addOriginSMTConstraints(self):
        """
        Realize to transfer the CCSL constraints into SMT formula.
        :return:
        """
        cnt = 0
        for each in self.newCCSLConstraintList:
            if each[0] == "<" and len(each) == 3:
                tick1 = self.tickDict["t_%s" % (each[1])]
                tick2 = self.tickDict["t_%s" % (each[2])]
                history1 = self.historyDict["h_%s" % (each[1])]
                history2 = self.historyDict["h_%s" % (each[2])]
                x = z3.Int("x")
                if self.bound > 0:
                    for i in range(1, self.bound + 2):
                        self.solver.add(
                            z3.Implies(
                                history1(i) == history2(i), z3.Not(tick2(i))))
                    # self.solver.add(z3.ForAll(x, z3.Implies(
                    #     z3.And(x >= 1, x <= self.n, history1(x) == history2(x)),
                    #     z3.Not(tick2(x)))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(
                                z3.And(x >= 1,
                                       history1(x) == history2(x)),
                                z3.Not(tick2(x)))))

            elif each[0] == "<" and len(each) == 4:
                tick1 = self.tickDict["t_%s" % (each[1])]
                delay = each[2]
                tick2 = self.tickDict["t_%s" % (each[3])]
                history1 = self.historyDict["h_%s" % (each[1])]
                history2 = self.historyDict["h_%s" % (each[3])]
                x = z3.Int("x")
                if self.bound > 0:
                    for i in range(1, self.bound + 2):
                        self.solver.add(
                            z3.Implies(
                                history2(i) - history1(i) == delay,
                                z3.Not(tick2(i))))
                    # self.solver.add(z3.ForAll(x, z3.Implies(
                    #     z3.And(x >= 1, x <= self.n, history2(x) - history1(x) == delay),
                    #     z3.Not(tick2(x)))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(
                                z3.And(x >= 1,
                                       history2(x) - history1(x) == delay),
                                z3.Not(tick2(x)))))

            elif each[0] == "≤":
                history1 = self.historyDict["h_%s" % (each[1])]
                history2 = self.historyDict["h_%s" % (each[2])]
                x = z3.Int("x")
                if self.bound > 0:
                    for i in range(1, self.bound + 2):
                        self.solver.add(history1(i) >= history2(i))
                    # self.solver.add(z3.ForAll(x, z3.Implies(
                    #     z3.And(x >= 1, x <= self.n + 1),
                    #     history1(x) >= history2(x))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x, z3.Implies(x >= 1,
                                          history1(x) >= history2(x))))

            elif each[0] == "⊆":
                tick1 = self.tickDict["t_%s" % (each[1])]
                tick2 = self.tickDict["t_%s" % (each[2])]
                x = z3.Int("x")
                if self.bound > 0:
                    for i in range(1, self.bound + 1):
                        self.solver.add(z3.Implies(tick1(i), tick2(i)))
                    # self.solver.add(z3.ForAll(x, z3.Implies(
                    #     z3.And(x >= 1, x <= self.n, tick1(x)),
                    #     tick2(x))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x, z3.Implies(z3.And(x >= 1, tick1(x)), tick2(x))))

            elif each[0] == "#":
                tick1 = self.tickDict["t_%s" % (each[1])]
                tick2 = self.tickDict["t_%s" % (each[2])]
                x = z3.Int("x")
                if self.bound > 0:
                    for i in range(1, self.bound + 1):
                        self.solver.add(
                            z3.Or(z3.Not(tick1(i)), z3.Not(tick2(i))))
                    # self.solver.add(z3.ForAll(x, z3.Implies(
                    #     z3.And(x >= 1, x <= self.n),
                    #     z3.Or(z3.Not(tick1(x)), z3.Not(tick2(x))))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(
                                x >= 1,
                                z3.Or(z3.Not(tick1(x)), z3.Not(tick2(x))))))

            elif each[0] == "+":
                tick1 = self.tickDict["t_%s" % (each[1])]
                tick2 = self.tickDict["t_%s" % (each[2])]
                tick3 = self.tickDict["t_%s" % (each[3])]
                x = z3.Int("x")
                if self.bound > 0:
                    for i in range(1, self.bound + 1):
                        self.solver.add(tick1(i) == z3.Or(tick2(i), tick3(i)))
                    # self.solver.add(z3.ForAll(x, z3.Implies(
                    #         z3.And(x >= 1, x <= self.n),
                    #         tick1(x) == z3.Or(tick2(x), tick3(x)))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(x >= 1,
                                       tick1(x) == z3.Or(tick2(x), tick3(x)))))

            elif each[0] == "*":
                tick1 = self.tickDict["t_%s" % (each[1])]
                tick2 = self.tickDict["t_%s" % (each[2])]
                tick3 = self.tickDict["t_%s" % (each[3])]
                x = z3.Int("x")
                if self.bound > 0:
                    for i in range(1, self.bound + 1):
                        self.solver.add(
                            z3.Implies(tick1(i), z3.And(tick2(i), tick3(i))))
                    # self.solver.add(z3.ForAll(x, z3.Implies(
                    #         z3.And(x >= 1, x <= self.n),
                    #         tick1(x) == z3.And(tick2(x), tick3(x)))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(x >= 1,
                                       tick1(x) == z3.And(tick2(x),
                                                          tick3(x)))))

            elif each[0] == "∧":
                history1 = self.historyDict["h_%s" % (each[1])]
                history2 = self.historyDict["h_%s" % (each[2])]
                history3 = self.historyDict["h_%s" % (each[3])]
                x = z3.Int("x")
                if self.bound > 0:
                    for i in range(1, self.bound + 2):
                        self.solver.add(
                            history1(i) == z3.If(
                                history2(i) >= history3(i), history2(i),
                                history3(i)))
                    # self.solver.add(z3.ForAll(x, z3.Implies(
                    #     z3.And(x >= 1, x <= self.n + 1),
                    #     history1(x) == z3.If(history2(x) >= history3(x),history2(x),history3(x)))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(
                                x >= 1,
                                history1(x) == z3.If(
                                    history2(x) >= history3(x), history2(x),
                                    history3(x)))))

            elif each[0] == "∨":
                history1 = self.historyDict["h_%s" % (each[1])]
                history2 = self.historyDict["h_%s" % (each[2])]
                history3 = self.historyDict["h_%s" % (each[3])]
                x = z3.Int("x")
                if self.bound > 0:
                    for i in range(1, self.bound + 2):
                        self.solver.add(
                            history1(i) == z3.If(
                                history2(i) <= history3(i), history2(i),
                                history3(i)))
                    # self.solver.add(z3.ForAll(x, z3.Implies(
                    #     z3.And(x >= 1, x <= self.n + 1),
                    #     history1(x) == z3.If(history2(x) <= history3(x), history2(x), history3(x)))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(
                                x >= 1,
                                history1(x) == z3.If(
                                    history2(x) <= history3(x), history2(x),
                                    history3(x)))))

            elif each[0] == "$":
                history1 = self.historyDict["h_%s" % (each[1])]
                history2 = self.historyDict["h_%s" % (each[2])]
                delay = z3.IntVal(int(each[3]))
                x = z3.Int("x")
                if self.bound > 0:
                    for i in range(1, self.bound + 2):
                        self.solver.add(
                            history1(i) == z3.If(
                                history2(i) >= delay,
                                history2(i) - delay, 0))
                    # self.solver.add(z3.ForAll(x, z3.Implies(
                    #     z3.And(x >= 1, x <= self.n + 1),
                    #     history1(x) == z3.If(history2(x) >= delay,history2(x) - delay,0))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(
                                x >= 1,
                                history1(x) == z3.If(
                                    history2(x) >= delay,
                                    history2(x) - delay, 0))))

            elif each[0] == "on":
                tick1 = self.tickDict["t_%s" % (each[1])]
                tick2 = self.tickDict["t_%s" % (each[2])]
                tick3 = self.tickDict["t_%s" % (each[4])]
                history1 = self.historyDict["h_%s" % (each[1])]
                history2 = self.historyDict["h_%s" % (each[2])]
                history3 = self.historyDict["h_%s" % (each[4])]
                self.addTickStep(each[1])
                self.addTickStep(each[2])
                self.addTickStep(each[4])
                tickStep1 = self.tickStep["s_%s" % (each[1])]
                tickStep2 = self.tickStep["s_%s" % (each[2])]
                tickStep3 = self.tickStep["s_%s" % (each[4])]
                x = z3.Int("x")
                if self.bound > 0:
                    for i in range(1, int(each[3]) + 1):
                        self.solver.add(z3.Not(tick1(i)))
                    for i in range(int(each[3]) + 1, self.bound + 1):
                        t = []
                        for j in range(1, i - int(each[3]) + 1):
                            t.append(
                                z3.And(
                                    tick2(j),
                                    history3(i) - history3(j) == int(each[3])))
                        self.solver.add(z3.And(tick3(i), z3.Or(t)) == tick1(i))
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(z3.And(x > 0, x <= self.n + 1),
                                       history2(x) >= history1(x))))
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(z3.And(x > 0, x <= self.n, tick1(x)),
                                       tick3(x))))
                    # self.solver.add(
                    #     z3.ForAll(x, z3.Implies(
                    #         z3.And(x > 0, x <= history1(self.bound + 1)),
                    #         history3(tickStep2(x)) - history3(tickStep1(x)) == int(each[3])
                    # )))
                    # for i in range(self.bound + 1):
                    #     self.solver.add(history2(i) >= history1(i))
                    # for i in range(self.bound):
                    #     self.solver.add(
                    #         z3.Implies(
                    #             tick1(i), tick3(i)
                    #         )
                    #     )
                    # for i in range(self.bound + 1):
                    #     self.solver.add(
                    #         history3(tickStep1(i)) - history3(tickStep2(i)) == int(each[3])
                    #     )

                    # self.solver.add(z3.ForAll(x, z3.And(
                    #     z3.Implies(z3.And(x >= 1, x <= history1(self.bound + 1),tick2(x)),
                    #         tick1(tickStep3(history3(x) + int(each[3])))
                    #     ))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.And(
                                z3.Implies(x >= 1,
                                           history2(x) >= history1(x)))))
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.And(
                                z3.Implies(z3.And(x >= 1, tick1(x)),
                                           tick3(x)))))
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.And(
                                z3.Implies(x >= 1, (history3(tickStep1(x)) -
                                                    history3(tickStep2(x))
                                                    == int(each[3]))))))
            elif each[0] == "∝":
                tick1 = self.tickDict["t_%s" % (each[1])]
                tick2 = self.tickDict["t_%s" % (each[2])]
                history1 = self.historyDict["h_%s" % (each[1])]
                history2 = self.historyDict["h_%s" % (each[2])]
                x = z3.Int("x")
                left = tick1(x)
                if is_number(each[3]):
                    k = z3.Int("k_%s" % (cnt))
                    self.solver.add(k >= 0, k < int(each[3]))
                    right = z3.And(tick2(x),
                                   history2(x) >= 0,
                                   (history2(x) + k) % z3.IntVal(each[3]) == 0)
                    cnt += 1
                    # right = z3.And(tick2(x), history2(x) > 0, (history2(x)) % z3.IntVal(each[3]) == 0)
                else:
                    period = z3.Int("%s" % each[3])
                    tmp = self.parameter[each[3]]
                    self.printParameter[each[3]] = period
                    k = z3.Int("k_%s" % (cnt))
                    self.solver.add(k >= 0, k < period)
                    right = z3.And(tick2(x),
                                   history2(x) >= 0,
                                   (history2(x) + k) % period == 0)
                    self.solver.add(period >= int(tmp[2]))
                    self.solver.add(period <= int(tmp[3]))
                    cnt += 1
                if self.bound > 0:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.And(
                                z3.Implies(z3.And(x >= 1, x <= self.n),
                                           left == right))))
                else:
                    self.solver.add(
                        z3.ForAll(x, z3.And(z3.Implies(x >= 1,
                                                       left == right))))

            elif each[0] == "☇":
                tick1 = self.tickDict["t_%s" % (each[1])]
                tick2 = self.tickDict["t_%s" % (each[2])]
                tick3 = self.tickDict["t_%s" % (each[3])]
                history1 = self.historyDict["h_%s" % (each[1])]
                history2 = self.historyDict["h_%s" % (each[2])]
                history3 = self.historyDict["h_%s" % (each[3])]
                self.addTickStep(each[1])
                self.addTickStep(each[3])
                tickStep1 = self.tickStep["s_%s" % (each[1])]
                tickStep3 = self.tickStep["s_%s" % (each[3])]
                x = z3.Int("x")
                if self.bound > 0:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(
                                z3.And(x >= 2, x <= history3(self.bound + 1)),
                                tick1(tickStep1(x)) == (
                                    history2(tickStep3(x)) -
                                    history2(tickStep3(x - 1)) >= 1))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(
                                x >= 2,
                                z3.And(
                                    tick1(tickStep1(x)),
                                    history2(tickStep3(x)) -
                                    history2(tickStep3(x - 1)) >= 1))))

            elif each[0] == "==":
                tick1 = self.tickDict["t_%s" % (each[1])]
                tick2 = self.tickDict["t_%s" % (each[2])]
                x = z3.Int("x")
                if self.bound > 0:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(z3.And(x >= 1, x <= self.n),
                                       tick1(x) == tick2(x))))
                else:
                    self.solver.add(
                        z3.ForAll(x, z3.Implies(x >= 1,
                                                tick1(x) == tick2(x))))
            elif each[0] == "⋈±":
                tick1 = self.tickDict["t_%s" % (each[1])]
                tick2 = self.tickDict["t_%s" % (each[2])]
                history1 = self.historyDict["h_%s" % (each[1])]
                history2 = self.historyDict["h_%s" % (each[2])]
                self.addTickStep(each[1])
                self.addTickStep(each[2])
                tickStep1 = self.tickStep["s_%s" % (each[1])]
                tickStep2 = self.tickStep["s_%s" % (each[2])]

                lower = int(each[3]) - int(each[4])
                upper = int(each[3]) + int(each[4])
                x = z3.Int("x")
                if self.bound > 0:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(
                                z3.And(x >= 1, x <= self.bound + 1, tick1(x)),
                                history1(tickStep2(history2(x) + upper)) -
                                history1(
                                    tickStep2(history2(x) + lower)) == 1)))
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(
                                z3.And(x >= 2, x <= history1(self.bound + 1)),
                                z3.And(
                                    (history2(tickStep1(x)) -
                                     history2(tickStep1(x - 1)) >= lower),
                                    (history2(tickStep1(x)) -
                                     history2(tickStep1(x - 1)) <= upper)))))
                else:
                    self.solver.add(
                        z3.ForAll(
                            x,
                            z3.Implies(
                                x >= 2,
                                z3.And(
                                    (history2(tickStep1(x)) -
                                     history2(tickStep1(x - 1)) >= lower),
                                    (history2(tickStep1(x)) -
                                     history2(tickStep1(x - 1)) <= upper)))))