def mk_local(n, kind, off, k): (v, off2) = sp_reps[n][k] ptr = syntax.mk_plus(v, syntax.mk_word32(off + off2)) if kind == 'Ptr': return ptr elif kind == 'MemAcc': return syntax.mk_memacc(stack, ptr, syntax.word32T)
def mk_local (n, kind, off, k): (v, off2) = sp_reps[n][k] ptr = syntax.mk_plus (v, syntax.mk_word32 (off + off2)) if kind == 'Ptr': return ptr elif kind == 'MemAcc': return syntax.mk_memacc (stack, ptr, syntax.word32T)
def split_hyps_at_visit(tags, split, restrs, visit): (l_details, r_details, eqs, _, _) = split (l_split, (l_seq_start, l_step), l_eqs) = l_details (r_split, (r_seq_start, r_step), r_eqs) = r_details (l_visit, r_visit) = split_visit_visits(tags, split, restrs, visit) (l_start, r_start) = split_visit_visits(tags, split, restrs, vc_num(0)) (l_tag, r_tag) = tags def mksub(v): return lambda exp: logic.var_subst(exp, {('%i', word32T): v}, must_subst=False) def inst(exp): return logic.inst_eq_at_visit(exp, visit) zsub = mksub(mk_word32(0)) if visit.kind == 'Number': lsub = mksub(mk_word32(visit.n)) else: lsub = mksub(mk_plus(mk_var('%n', word32T), mk_word32(visit.n))) hyps = [(Hyp('PCImp', l_visit, r_visit), 'pc imp'), (Hyp('PCImp', l_visit, l_start), '%s pc imp' % l_tag), (Hyp('PCImp', r_visit, r_start), '%s pc imp' % r_tag)] hyps += [(eq_hyp((zsub(l_exp), l_start), (lsub(l_exp), l_visit), (l_split, r_split)), '%s const' % l_tag) for l_exp in l_eqs if inst(l_exp)] hyps += [(eq_hyp((zsub(r_exp), r_start), (lsub(r_exp), r_visit), (l_split, r_split)), '%s const' % r_tag) for r_exp in r_eqs if inst(r_exp)] hyps += [(eq_hyp((lsub(l_exp), l_visit), (lsub(r_exp), r_visit), (l_split, r_split)), 'eq') for (l_exp, r_exp) in eqs if inst(l_exp) and inst(r_exp)] return hyps
def split_hyps_at_visit (tags, split, restrs, visit): (l_details, r_details, eqs, _, _) = split (l_split, (l_seq_start, l_step), l_eqs) = l_details (r_split, (r_seq_start, r_step), r_eqs) = r_details (l_visit, r_visit) = split_visit_visits (tags, split, restrs, visit) (l_start, r_start) = split_visit_visits (tags, split, restrs, vc_num (0)) (l_tag, r_tag) = tags def mksub (v): return lambda exp: logic.var_subst (exp, {('%i', word32T) : v}, must_subst = False) def inst (exp): return logic.inst_eq_at_visit (exp, visit) zsub = mksub (mk_word32 (0)) if visit.kind == 'Number': lsub = mksub (mk_word32 (visit.n)) else: lsub = mksub (mk_plus (mk_var ('%n', word32T), mk_word32 (visit.n))) hyps = [(Hyp ('PCImp', l_visit, r_visit), 'pc imp'), (Hyp ('PCImp', l_visit, l_start), '%s pc imp' % l_tag), (Hyp ('PCImp', r_visit, r_start), '%s pc imp' % r_tag)] hyps += [(eq_hyp ((zsub (l_exp), l_start), (lsub (l_exp), l_visit), (l_split, r_split)), '%s const' % l_tag) for l_exp in l_eqs if inst (l_exp)] hyps += [(eq_hyp ((zsub (r_exp), r_start), (lsub (r_exp), r_visit), (l_split, r_split)), '%s const' % r_tag) for r_exp in r_eqs if inst (r_exp)] hyps += [(eq_hyp ((lsub (l_exp), l_visit), (lsub (r_exp), r_visit), (l_split, r_split)), 'eq') for (l_exp, r_exp) in eqs if inst (l_exp) and inst (r_exp)] return hyps
def loop_eq_hyps_at_visit(tag, split, eqs, restrs, visit_num, use_if_at=False): details = (split, (0, 1), eqs) visit = split_visit_one_visit(tag, details, restrs, visit_num) start = split_visit_one_visit(tag, details, restrs, vc_num(0)) def mksub(v): return lambda exp: logic.var_subst(exp, {('%i', word32T): v}, must_subst=False) zsub = mksub(mk_word32(0)) if visit_num.kind == 'Number': isub = mksub(mk_word32(visit_num.n)) else: isub = mksub(mk_plus(mk_var('%n', word32T), mk_word32(visit_num.n))) hyps = [(Hyp('PCImp', visit, start), '%s pc imp' % tag)] hyps += [(eq_hyp((zsub(exp), start), (isub(exp), visit), (split, 0), use_if_at=use_if_at), '%s const' % tag) for exp in eqs if logic.inst_eq_at_visit(exp, visit_num)] return hyps
def linear_eq_hyps_at_visit (tag, split, eqs, restrs, visit_num): details = (split, (0, 1), eqs) visit = split_visit_one_visit (tag, details, restrs, visit_num) start = split_visit_one_visit (tag, details, restrs, vc_num (0)) from syntax import mk_word32, mk_plus, mk_var, word32T def mksub (v): return lambda exp: logic.var_subst (exp, {('%i', word32T) : v}, must_subst = False) zsub = mksub (mk_word32 (0)) if visit_num.kind == 'Number': isub = mksub (mk_word32 (visit_num.n)) else: isub = mksub (mk_plus (mk_var ('%n', word32T), mk_word32 (visit_num.n))) hyps = [(Hyp ('PCImp', visit, start), '%s pc imp' % tag)] hyps += [(eq_hyp ((zsub (exp), start), (isub (exp), visit), (split, 0)), '%s const' % tag) for exp in eqs if logic.inst_eq_at_visit (exp, visit_num)] return hyps