Ejemplo n.º 1
0
def minimize(tbl, q, signals):
    num = q+signals
    print "====== minimization ======"
    matrix = implicant_matrix(tbl, q, signals)
    eq_1 = [x[0] for x in filter(lambda x: x[1], matrix)]
    group_cur = [filter(lambda x: x.count("1") == n, eq_1) for n in range(num+1)]
    glue = True
    implicants = []
    while group_cur:
        groups = []
        glued = []
        for i in zip(group_cur, group_cur[1:]):
            impl, glued_i = do_glue(i)
            glued += impl
            groups.append(glued_i)
        implicants = list(set(implicants + reduce(operator.add, group_cur)) - set(glued))
        group_cur = groups
    print implicants

    lst = {}
    for minterm in eq_1:
        lst[minterm] = [x for x in implicants if len(machine.code_diff(x, minterm, star=True)) == 0]
    simple = list(set(itertools.chain(*[v for i,v in lst.iteritems() if len(v) == 1])))
    not_simple = list(set(itertools.chain(*[v for i,v in lst.iteritems() if len(v) > 1])))

    ok = False
    index = 0
    while not ok:
        new_implicants = simple + not_simple[:index]
        for minterm in eq_1:
            if len([x for x in new_implicants if len(machine.code_diff(x, minterm, star=True)) == 0]) == 0:
                # no coverage
                index += 1
                break
        else:
            ok = True
        if index > len(not_simple):
            raise Exception("WTF")

    ret = []
    for item in new_implicants:
        cur_item = []
        for i, char in enumerate(item):
            if char != "*":
                if i < q:
                    cur_item.append(condition(name='q', index=i, val=int(char)))
                else:
                    cur_item.append(condition(name='X', index=i-1, val=int(char)))
        ret.append(cur_item)
    return ret
Ejemplo n.º 2
0
def build_table(connections, signals, codes, add):
    table = []
    for c in connections:
        bit = machine.code_diff(codes[c[0]], codes[c[1]])
        table.append(
            table_item(q=codes[c[0]],
                       q2=codes[c[1]],
                       signals=c[2],
                       bit=bit,
                       y=signals.get(c[0])))  # from, to, changed bit
    return table
Ejemplo n.º 3
0
def do_glue(pair):
    glued_1, glued_2, glued_res = [], [], []  # from list 1 or 2
    for x in pair[0]:
        for y in pair[1]:
            diff = machine.code_diff(x,y)
            if len(diff) == 1 and machine.code_stars(x) == machine.code_stars(y):
                glued = x, y
                glued_1.append(x)
                glued_2.append(y)
                impl = bytearray(x[:])
                impl[diff[0]] = "*"
                glued_res.append(str(impl))
    return glued_1 + glued_2, glued_res
Ejemplo n.º 4
0
def do_glue(pair):
    glued_1, glued_2, glued_res = [], [], []  # from list 1 or 2
    for x in pair[0]:
        for y in pair[1]:
            diff = machine.code_diff(x, y)
            if len(diff) == 1 and machine.code_stars(x) == machine.code_stars(
                    y):
                glued = x, y
                glued_1.append(x)
                glued_2.append(y)
                impl = bytearray(x[:])
                impl[diff[0]] = "*"
                glued_res.append(str(impl))
    return glued_1 + glued_2, glued_res
Ejemplo n.º 5
0
def minimize(tbl, q, signals):
    num = q + signals
    print "====== minimization ======"
    matrix = implicant_matrix(tbl, q, signals)
    eq_1 = [x[0] for x in filter(lambda x: x[1], matrix)]
    group_cur = [
        filter(lambda x: x.count("1") == n, eq_1) for n in range(num + 1)
    ]
    glue = True
    implicants = []
    while group_cur:
        groups = []
        glued = []
        for i in zip(group_cur, group_cur[1:]):
            impl, glued_i = do_glue(i)
            glued += impl
            groups.append(glued_i)
        implicants = list(
            set(implicants + reduce(operator.add, group_cur)) - set(glued))
        group_cur = groups
    print implicants

    lst = {}
    for minterm in eq_1:
        lst[minterm] = [
            x for x in implicants
            if len(machine.code_diff(x, minterm, star=True)) == 0
        ]
    simple = list(
        set(itertools.chain(*[v for i, v in lst.iteritems() if len(v) == 1])))
    not_simple = list(
        set(itertools.chain(*[v for i, v in lst.iteritems() if len(v) > 1])))

    ok = False
    index = 0
    while not ok:
        new_implicants = simple + not_simple[:index]
        for minterm in eq_1:
            if len([
                    x for x in new_implicants
                    if len(machine.code_diff(x, minterm, star=True)) == 0
            ]) == 0:
                # no coverage
                index += 1
                break
        else:
            ok = True
        if index > len(not_simple):
            raise Exception("WTF")

    ret = []
    for item in new_implicants:
        cur_item = []
        for i, char in enumerate(item):
            if char != "*":
                if i < q:
                    cur_item.append(condition(name='q', index=i,
                                              val=int(char)))
                else:
                    cur_item.append(
                        condition(name='X', index=i - 1, val=int(char)))
        ret.append(cur_item)
    return ret
Ejemplo n.º 6
0
def build_table(connections, signals, codes, add):
    table = []
    for c in connections:
        bit = machine.code_diff(codes[c[0]], codes[c[1]])
        table.append(table_item(q=codes[c[0]], q2=codes[c[1]], signals=c[2], bit=bit, y=signals.get(c[0]))) # from, to, changed bit
    return table