74 lines
2.4 KiB
Python
74 lines
2.4 KiB
Python
from logics.param_constr import *
|
|
from z3 import And, Not, Or
|
|
|
|
|
|
class ParamConstr_Encoder(object):
|
|
"""Class for encoding parameter constraints"""
|
|
|
|
def __init__(self, smt_checker):
|
|
self.smt_checker = smt_checker
|
|
self.rs = smt_checker.rs
|
|
|
|
# self.v = None
|
|
# self.v_ctx = None
|
|
# self.loop_position = None
|
|
|
|
def load_variables(self, var_rs, var_ctx, var_loop_pos):
|
|
self.v = var_rs
|
|
self.v_ctx = var_ctx
|
|
self.loop_position = var_loop_pos
|
|
|
|
def encode(self, param_constr):
|
|
if not param_constr:
|
|
raise RuntimeError("param_constr is None")
|
|
|
|
if param_constr.f_type == ParamConstraint_oper.param_entity:
|
|
return self.smt_checker.get_enc_param(
|
|
param_constr.param.name, param_constr.entity
|
|
)
|
|
|
|
if param_constr.f_type == ParamConstraint_oper.true:
|
|
return True
|
|
|
|
if param_constr.f_type == ParamConstraint_oper.l_and:
|
|
return And(
|
|
self.encode(param_constr.left_operand),
|
|
self.encode(param_constr.right_operand),
|
|
)
|
|
|
|
if param_constr.f_type == ParamConstraint_oper.l_or:
|
|
return Or(
|
|
self.encode(param_constr.left_operand),
|
|
self.encode(param_constr.right_operand),
|
|
)
|
|
|
|
if param_constr.f_type == ParamConstraint_oper.l_not:
|
|
return Not(self.encode(param_constr.left_operand))
|
|
|
|
if param_constr.f_type == ParamConstraint_oper.lt:
|
|
return self.encode(param_constr.left_operand) < int(
|
|
param_constr.right_operand
|
|
)
|
|
|
|
if param_constr.f_type == ParamConstraint_oper.le:
|
|
return self.encode(param_constr.left_operand) <= int(
|
|
param_constr.right_operand
|
|
)
|
|
|
|
if param_constr.f_type == ParamConstraint_oper.eq:
|
|
return self.encode(param_constr.left_operand) == int(
|
|
param_constr.right_operand
|
|
)
|
|
|
|
if param_constr.f_type == ParamConstraint_oper.ge:
|
|
return self.encode(param_constr.left_operand) >= int(
|
|
param_constr.right_operand
|
|
)
|
|
|
|
if param_constr.f_type == ParamConstraint_oper.gt:
|
|
return self.encode(param_constr.left_operand) > int(
|
|
param_constr.right_operand
|
|
)
|
|
|
|
assert False, "Unsupported case {:s}".format(param_constr.f_type)
|