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
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
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
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
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
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