def update():
    r'''Update side_effects and suspends *from* database.
    '''
    for id in crud.read_column('symbol_table', 'id', side_effects=1):
        Symbols_by_id[id].side_effects = True
    for id in crud.read_column('symbol_table', 'id', suspends=1):
        Symbols_by_id[id].suspends = True
def init():
    crud.Db_conn = crud.db.connect('avr.db')
    crud.Db_cur = crud.Db_conn.cursor()
    try:
        # insert 0's for m=0:

        crud.Db_cur.execute("""
          insert into worst (N, C, m, value)
            select N.id, C.id, 0, 0 from reg_class N cross join reg_class C
        """)

        crud.Db_conn.commit()

        registers = crud.read_column('register', 'name')
        aliases = {}
        for R in registers:
            aliases[R] = frozenset(crud.read_column('alias', 'r2', r1=R))

        reg_classes = crud.read_column('reg_class', 'id')
        regs_in_class = {}
        for C in reg_classes:
            regs_in_class[C] = \
              frozenset(crud.read_column('reg_in_class', 'reg', reg_class=C))
        print 'reg_classes', reg_classes

        for N in reg_classes:
            print 'N', N
            N_regs = regs_in_class[N]
            for C in reg_classes:
                C_regs = regs_in_class[C]
                print 'C', C, C_regs

                # {set of S: set of registers}
                worsts0 = {frozenset(): frozenset()}

                for m in range(1, len(C_regs) + 1):
                    print 'm', m
                    worsts1 = {}
                    for R in C_regs:
                        for S0, regs in worsts0.iteritems():
                            if R not in S0:
                                worsts1[S0.union((R,))] = \
                                    regs.union(aliases[R]).intersection(N_regs)
                    crud.insert('worst', N=N, C=C, m=m,
                                value=max(len(regs)
                                          for regs in worsts1.itervalues()))
                    worsts0 = worsts1
            crud.Db_conn.commit()
        worst0 = worst1 = None
    except:
        crud.Db_conn.rollback()
        raise
    finally:
        crud.Db_cur.close()
        crud.Db_conn.close()
 def __init__(self, row, triple_id_map):
     for key, value in row.iteritems():
         setattr(self, key, value)
     self.labels = tuple(crud.read_column('triple_labels', 'symbol_id',
                                          triple_id=self.id))
     self.predecessors = tuple(crud.read_column('triple_order_constraints',
                                                'predecessor',
                                                successor=self.id))
     triple_id_map[self.id] = self
     self.parents = []
     self.updated_attributes = []
     self.children = [self]
def class_compares():
    crud.Db_conn = crud.db.connect('avr.db')
    crud.Db_cur = crud.Db_conn.cursor()
    try:
        reg_classes = crud.read_column('reg_class', 'id')
        aliases = {}
        for C in reg_classes:
            aliases[C] = \
              frozenset(crud.read_column('class_alias', 'reg', reg_class=C))

        for C1, C2 in itertools.combinations(reg_classes, 2):
            if aliases[C1] == aliases[C2]:
                print C1, 'alias-equivalent', C2
            elif aliases[C1].issubset(aliases[C2]):
                print C1, 'alias-contained in', C2
            elif aliases[C2].issubset(aliases[C1]):
                print C2, 'alias-contained in', C1
            elif not aliases[C1].isdisjoint(aliases[C2]):
                print C1, '*** UNKNOWN ***', C2

    finally:
        crud.Db_cur.close()
        crud.Db_conn.close()
def delete(symbol):
    r'''Deletes all of the blocks associated with 'symbol' from the database.

    This also deletes all associated information in the database for the
    deleted blocks.

    This is used to delete the results from a prior compile run.
    '''
    block_ids = crud.read_column('blocks', 'id', word_symbol_id=symbol)
    if block_ids:
        crud.delete('gens', block_id=block_ids)
        crud.delete('kills', block_id=block_ids)
        crud.delete('ins', block_id=block_ids)
        crud.delete('outs', block_id=block_ids)
        triple.delete(block_ids)
        crud.delete('block_successors', predecessor=block_ids)
        crud.delete('block_successors', successor=block_ids)
        crud.delete('blocks', id=block_ids)