Esempio n. 1
0
def test3():
    I1 = ila.Abstraction('a')
    inp1 = I1.inp('inp', 1)
    r1 = I1.reg('r1', 5)

    I1.decode_exprs = [inp1 == 1, inp1 == 0]

    uI1 = I1.add_microabstraction("mic", (r1 != 0) & (r1 < 2))

    I1.set_next('r1', ila.ite(inp1 == 1, I1.const(1, 5), I1.const(0, 5)))

    ur1 = uI1.reg('ur1', 5)
    r1p = uI1.getreg('r1')
    uI1.set_init('ur1', uI1.const(0, 5))
    uI1.set_next('ur1', ur1 + 1)
    uI1.set_next('r1', ila.ite(ur1 > 5, ur1, r1p))

    #######################

    I2 = ila.Abstraction('b')
    inp2 = I2.inp('inp', 1)
    r2 = I2.reg('r1', 5)

    uI2 = I2.add_microabstraction("mic", (r2 != 0) & (r2 < 2))

    I2.set_next('r1', ila.ite(inp2 == 1, I2.const(1, 5), I2.const(0, 5)))

    I2.decode_exprs = [inp2 == 1, inp2 == 0]
    ur2 = uI2.reg('ur1', 5)
    r2p = uI2.getreg('r1')
    uI2.set_init('ur1', uI1.const(0, 5))
    uI2.set_next('ur1', ur2 + 3)
    uI2.set_next('r1', ila.ite(ur2 > 5, ur2, r2p))

    print 'simple signature test:'
    print ila.eqcheckSimple(I1, I2)

    print 'full test'
    u1 = I1.newUnroller(uI1, True)
    u1.addAssumption(inp1 == 1)
    u1.unrollTo(20)
    u1.checkAssertion(~(uI1.fetch_valid))
    u1.checkAssertion(r1 == 6)

    u2 = I2.newUnroller(uI2, True)
    u2.addAssumption(inp2 == 1)
    u2.unrollTo(20)
    u2.checkAssertion(~(uI2.fetch_valid))
    u2.checkAssertion(r2 == 6)

    print ila.eqcheck(u1, u2, 'r1', 'r1')
Esempio n. 2
0
    def Exit(self, bound1, bound2, a1, a2, c1, c2, CrossAssumpt,
             CrossConclusion):
        ## For abs 1
        checkRsFlag = True
        u1 = self.a1.newUnroller(self.ua1, setInitCondition=False)

        print 'Assuming:'
        invStr = ' AND '.join(['$%d' % idx for idx in range(len(a1))] + ['$$'])
        for idx, inv in enumerate(a1):
            print '$%d = %s' % (idx, inv)

        for inv in a1:
            u1.addAssumption(inv)

        print 'Unrolling...'
        u1.unrollTo(bound1)
        u1.addAssumption(~self.ua1.fetch_valid)
        print 'And also micro-program terminates: ', ~self.ua1.fetch_valid

        for idx, cond in enumerate(c1):
            print invStr + ' -> ' + str(cond)
            checkRsFlag = checkRsFlag and u1.checkAssertion(cond)

        ## For abs 2
        u2 = self.a2.newUnroller(self.ua2, setInitCondition=False)
        print 'Assuming:'
        invStr = ' AND '.join(['$%d' % idx for idx in range(len(a2))] + ['$$'])
        for idx, inv in enumerate(a2):
            print '$%d = %s' % (idx, inv)

        for inv in a2:
            u2.addAssumption(inv)

        u2.unrollTo(bound2)
        u2.addAssumption(~self.ua2.fetch_valid)
        print 'And also: micro-prog ends $$: ', ~self.ua2.fetch_valid

        for idx, cond in enumerate(c2):
            print invStr + ' -> ' + str(cond)
            checkRsFlag = checkRsFlag and u2.checkAssertion(cond)

        ## Cross
        CrossAssumptList = []
        for n1, n2 in CrossAssumpt:
            CrossAssumptList.append((1, n1, n2))
        for n1, n2 in CrossConclusion:
            ila.enablelog("Unroller")
            ila.setloglevel(3, "info.txt")
            if ila.eqcheck(u1, u2, n1, n2,
                           assumption=CrossAssumptList) == False:
                print 'left.{n1} = right.{n2}  --/-->  left.{n1} = right.{n2}'.format(
                    n1=n1, n2=n2)
                checkRsFlag = False
            else:
                print 'left.{n1} = right.{n2}  ==>>  left.{n1} = right.{n2},  is valid'.format(
                    n1=n1, n2=n2)

        return checkRsFlag
Esempio n. 3
0
def test4():
    I1 = ila.Abstraction('a')
    inp1 = I1.inp('inp', 1)
    r1 = I1.reg('r1', 5)
    r1a = I1.reg('ra', 5)

    I1.decode_exprs = [inp1 == 1, inp1 == 0]

    uI1 = I1.add_microabstraction("mic", (r1 != 0))

    I1.set_next('r1', ila.ite(inp1 == 1, I1.const(1, 5), I1.const(0, 5)))
    I1.set_next('ra', r1a)

    ur1 = uI1.reg('ur1', 5)

    r1p = uI1.getreg('r1')
    uI1.set_init('ur1', uI1.const(0, 5))
    uI1.set_next('ur1', ur1 + 1)

    ura1 = uI1.getreg('ra')
    uI1.set_next('ra', ura1 - 1)
    uI1.set_next('r1', ila.ite(ura1 == 1, I1.const(0, 5), I1.const(1, 5)))

    #######################
    I2 = ila.Abstraction('b')
    inp2 = I2.inp('inp', 1)
    r2 = I2.reg('r1', 5)
    r2a = I2.reg('ra', 5)

    I2.decode_exprs = [inp2 == 1, inp2 == 0]

    uI2 = I2.add_microabstraction("mic", (r2 != 0))

    I2.set_next('r1', ila.ite(inp2 == 1, I2.const(1, 5), I2.const(0, 5)))
    I2.set_next('ra', r2a)

    ur2 = uI2.reg('ur1', 5)

    r2p = uI2.getreg('r1')
    uI2.set_init('ur1', uI2.const(0, 5))
    uI2.set_next('ur1', ur2 + 1)

    ura2 = uI2.getreg('ra')
    uI2.set_next('ra', uI2.getreg('ra') - 1)
    uI2.set_next('r1', ila.ite(ura2 == 1, I2.const(0, 5), I2.const(1, 5)))

    print 'simple signature test:'
    print ila.eqcheckSimple(I1, I2)

    print 'full test'
    u1 = I1.newUnroller(uI1, False)
    u1.unrollTo(4)

    u2 = I2.newUnroller(uI2, False)
    u2.unrollTo(4)

    inductiveAssumpt = [(1, "r1", "r1"), (1, "ra", "ra"), (1, "ur1", "ur1")]
    print ila.eqcheck(u1, u2, "r1", "r1", inductiveAssumpt)
    print ila.eqcheck(u1, u2, "ra", "ra", inductiveAssumpt)
    print ila.eqcheck(u1, u2, "ur1", "ur1", inductiveAssumpt)
Esempio n. 4
0
    def InductiveStep(self, bound1, bound2, inv1, inv2, invCross):
        checkRsFlag = True
        ## For abs 1
        u1 = self.a1.newUnroller(self.ua1, setInitCondition=False)

        print 'Checking invariants:'
        invStr = ' AND '.join(['$%d' % idx for idx in range(len(inv1))])
        for idx, inv in enumerate(inv1):
            print '$%d = %s' % (idx, inv)

        for inv in inv1:
            u1.addAssumption(inv)

        print 'Unrolling...'
        u1.unrollTo(bound1)
        u1.addAssumption(self.ua1.fetch_valid)
        for idx, inv in enumerate(inv1):
            print 'Checking', invStr + ' -> ' + '$%d' % (idx), '...'
            checkRsFlag = checkRsFlag and u1.checkAssertion(inv)

        ## For abs 2
        print 'Checking invariants:'
        u2 = self.a2.newUnroller(self.ua2, setInitCondition=False)
        invStr = ' AND '.join(['$%d' % idx for idx in range(len(inv2))])
        for idx, inv in enumerate(inv2):
            print '$%d = %s' % (idx, inv)

        for inv in inv2:
            u2.addAssumption(inv)

        print 'Unrolling...'
        u2.unrollTo(bound2)
        u2.addAssumption(self.ua2.fetch_valid)
        for idx, inv in enumerate(inv2):
            print 'Checking', invStr + ' -> ' + '$%d' % (idx), '...'
            if u2.checkAssertion(inv) == False:
                print 'Fail!'
                return False

        ## Cross
        CrossAssumpt = []
        for n1, n2 in invCross:
            CrossAssumpt.append((1, n1, n2))
        for n1, n2 in invCross:
            if ila.eqcheck(u1, u2, n1, n2, assumption=CrossAssumpt) == False:
                print 'left.{n1} = right.{n2}  --/-->  left.{n1} = right.{n2}'.format(
                    n1=n1, n2=n2)
                return False

        return checkRsFlag
Esempio n. 5
0
    def BMC(self, bound1, bound2, decode1, decode2, conclusion1, conclusion2,
            conclusionCross):
        u1 = self.a1.newUnroller(self.ua1, setInitCondition=True)
        u1.addAssumption(decode1)
        u1.unrollTo(bound1)
        for c in conclusion1:
            print 'Checking base assertion:', c
            u1.checkAssertion(c)

        u2 = self.a2.newUnroller(self.ua2, setInitCondition=True)
        u2.addAssumption(decode2)
        u2.unrollTo(bound2)
        for c in conclusion2:
            print 'Checking base assertion:', c
            u2.checkAssertion(c)

        for n1, n2 in conclusionCross:
            print 'Checking left.%s = right.%s' % (n1, n2)
            if (ila.eqcheck(u1, u2, n1, n2)):
                print 'It is valid.'