Example #1
0
    def MemAcc(self, left, right):
        primed = False
        if TS.is_prime(left):
            primed = True
            left = TS.get_ref_var(left)

        timed_symbol = lambda v: v if not primed else TS.get_prime(v)
            
        memname = left.symbol_name()
        allsymbols = list(get_env().formula_manager.get_all_symbols())
        memsymbols = [(v.symbol_name(), timed_symbol(v)) for v in allsymbols \
                      if (not TS.is_prime(v)) and (not TS.is_timed(v)) and (v.symbol_name()[:len(memname)] == memname) \
                      and v.symbol_name() != memname]
        memsymbols.sort()
        memsize = len(memsymbols)

        if memsize < 1:
            Logger.error("Memory \"%s\" has size 1"%(memname))
        
        if right.is_int_constant():
            location = right.constant_value()
            if location > memsize-1:
                Logger.error("Out of bound access for memory \"%s\", size %d"%(memname, memsize))
            return memsymbols[location][1]
        else:
            if not (right.is_symbol() and right.symbol_type().is_bv_type()):
                Logger.error("Symbolic memory access requires Bitvector indexing")
            width_idx = right.symbol_type().width
            width_mem = min(memsize, width_idx)
            return mem_access(right, [m[1] for m in memsymbols], width_idx)
Example #2
0
    def parse_formulae(self, strforms):
        formulae = []

        if strforms is None:
            return formulae

        for strform in strforms:
            if ("#" not in strform) and (strform != ""):
                formula = self.parse_formula(strform)
                formula_fv = get_free_variables(formula)
                nextvars = [v for v in formula_fv if TS.is_prime(v)] != []
                prevvars = [v for v in formula_fv if TS.is_prev(v)] != []
                formulae.append((strform, formula, (nextvars, prevvars)))

        return formulae
Example #3
0
    def parse_formulae(self, str_or_fnodes):
        formulae = []

        if str_or_fnodes is None:
            return formulae

        for s in str_or_fnodes:
            if isinstance(s, str):
                if ('#' in s) or len(s) == 0:
                    continue
                formula = self.parse_formula(s)
            else:
                formula = s
            formula_fv = get_free_variables(formula)
            nextvars = [v for v in formula_fv if TS.is_prime(v)] != []
            prevvars = [v for v in formula_fv if TS.is_prev(v)] != []
            formulae.append((str(s), formula, (nextvars, prevvars)))

        return formulae
Example #4
0
 def walk_symbol(self, formula):
     if TS.is_prime(formula):
         self.write("next('%s')" % TS.get_ref_var(formula).symbol_name())
     else:
         self.write("'%s'" % formula.symbol_name())
    def generate_STS(self, lines):
        ts = TS("Additional system")
        init = TRUE()
        trans = TRUE()
        invar = TRUE()

        states = {}
        assigns = set([])
        varsmap = {}

        def def_var(name, vtype):
            if name in varsmap:
                return varsmap[name]
            var = Symbol(name, vtype)
            ts.add_state_var(var)
            return var

        for line in lines:
            if line.comment:
                continue
            if line.init:
                if T_I not in states:
                    states[T_I] = TRUE()

                if line.init.varname != "":
                    (value, typev) = self.__get_value(line.init.value)
                    ivar = def_var(line.init.varname, typev)
                    state = EqualsOrIff(ivar, value)
                else:
                    state = TRUE() if line.init.value == T_TRUE else FALSE()

                states[T_I] = And(states[T_I], state)

                # Optimization for the initial state assignment
                init = And(init, state)

            state = TRUE()
            if line.state:
                sname = T_S + line.state.id
                if (line.state.varname != ""):
                    (value, typev) = self.__get_value(line.state.value)
                    ivar = def_var(line.state.varname, typev)
                    state = EqualsOrIff(ivar, value)
                    assval = (sname, line.state.varname)
                    if assval not in assigns:
                        assigns.add(assval)
                    else:
                        Logger.error(
                            "Double assignment for variable \"%s\" at state \"%s\""
                            % (line.state.varname, sname))
                else:
                    state = TRUE() if line.state.value == T_TRUE else FALSE()

                if sname not in states:
                    states[sname] = TRUE()

                states[sname] = And(states[sname], state)

        stateid_width = math.ceil(math.log(len(states)) / math.log(2))
        stateid_var = Symbol(self.new_state_id(), BVType(stateid_width))

        init = And(init, EqualsOrIff(stateid_var, BV(0, stateid_width)))
        invar = And(
            invar,
            Implies(EqualsOrIff(stateid_var, BV(0, stateid_width)),
                    states[T_I]))
        states[T_I] = EqualsOrIff(stateid_var, BV(0, stateid_width))

        count = 1
        state_items = list(states.keys())
        state_items.sort()
        for state in state_items:
            if state == T_I:
                continue
            invar = And(
                invar,
                Implies(EqualsOrIff(stateid_var, BV(count, stateid_width)),
                        states[state]))
            states[state] = EqualsOrIff(stateid_var, BV(count, stateid_width))
            count += 1

        transdic = {}

        for line in lines:
            if line.comment:
                continue

            if line.trans:
                if states[line.trans.start] not in transdic:
                    transdic[states[line.trans.start]] = []
                transdic[states[line.trans.start]].append(
                    states[line.trans.end])

        for transition in transdic:
            (start, end) = (transition, transdic[transition])
            trans = And(trans, Implies(start, TS.to_next(Or(end))))

        vars_ = [v for v in get_free_variables(trans) if not TS.is_prime(v)]
        vars_ += get_free_variables(init)
        vars_ += get_free_variables(invar)

        invar = And(invar, BVULE(stateid_var, BV(count - 1, stateid_width)))
        ts.set_behavior(init, trans, invar)
        ts.add_state_var(stateid_var)

        hts = HTS("ETS")
        hts.add_ts(ts)
        invar_props = []
        ltl_props = []

        return (hts, invar_props, ltl_props)