コード例 #1
0
def float_net_checker(module: Module):
    net_names = module.nets
    passed = True
    for net_name in net_names:
        net = module.get_net(net_name)
        if not isinstance(net, PortIn) and not isinstance(net, PortOut):
            if len(net.post) == 0 or net.source is None:
                passed = False
                print("isolated net found at {}".format(net_name))
    if passed:
        print("\nNetlist check complete")
コード例 #2
0
def missing_instance_test(module: Module):
    net_names = module.nets
    inst_names = module.instance_names
    passed = True
    for net_name in net_names:
        net = module.get_net(net_name)
        if net.source_instance is not None:
            if net.source_instance.name not in inst_names:
                passed = False
                print(
                    "net {} source instance {} not recorded in module.".format(
                        net_name, net.source_instance.name))
    if passed:
        print("\nInstance check passed")
コード例 #3
0
def splitter_checker(module: Module):
    net_names = module.nets
    passed = True
    falied_instance = set()
    for net_name in net_names:
        net = module.get_net(net_name)
        if len(net.post) > 1:
            passed = False
            print("Unresolved fan-out found at net {}, fan out num {}".format(
                net_name, len(net.post)))
            for ins in net.post:
                if isinstance(ins.parent, Distributor):
                    falied_instance.add(ins.parent.name)
    if passed:
        print("\nfan out check passed.")
    return falied_instance
コード例 #4
0
def flow_checker(module: Module):
    module.reset_delay()
    net_names = module.nets
    passed = True
    for net_name in net_names:
        net = module.get_net(net_name)
        if len(net.get_parents()) >= 1:
            delays = {module.get_delay(pre.name) for pre in net.get_parents()}
            if len(delays) == 1:
                continue
            else:
                passed = False
                print("\nUnequal path found at node {}".format(net_name))
    delays = {module.delays.values()}
    if len(delays) != 1:
        print("\nOutputs delay not equal")
        passed = False
    if passed:
        print("\nEven data path test passed.")
コード例 #5
0
def majority_feasible_checker(target: Wire, maj_mod: Module):
    if len(target.get_parents()) != 2:
        return {}
    level = 4
    parents = target.get_parents()
    lp = parents.pop().get_ancestors(level)
    rp = parents.pop().get_ancestors(level)
    if isinstance(lp, dict):
        print(lp)
    if isinstance(rp, dict):
        print(rp)
    total = set.union(lp, rp, target.get_parents())
    ancestors = set.intersection(lp, rp)
    if len(ancestors) == 0:
        return {}
    comb = list()
    temp = set(ancestors)
    single_table = {x.name: True for x in ancestors}
    while len(temp) != 0:
        ans = temp.pop()
        for a in temp:
            if set.intersection(ans.get_children(), a.get_children(),
                                ancestors) != 0:
                if not ans.is_descendent_of(
                        a, level * 2) and not a.is_descendent_of(ans):
                    comb.append({ans, a})
                    single_table[ans.name] = False
                    single_table[a.name] = False
        if single_table[ans.name]:
            comb.append({ans})

    border = set()
    score = 0
    raw_score = 0

    for x in comb:
        destination = set(x)
        temp_boarder = {target}
        while len(destination) != 0:
            for tb in set(temp_boarder):
                if tb in destination:
                    to_remove = True
                    for tb2 in temp_boarder:
                        if tb2.is_descendent_of(tb, level * 2):
                            to_remove = False
                            break
                    if to_remove:
                        destination.remove(tb)
                    continue
                for d in destination:
                    if tb.is_descendent_of(d, level * 2):
                        temp_boarder.remove(tb)
                        temp_boarder.update(tb.get_parents())
                        break
        clean_boarder = set()
        for t in temp_boarder:
            if not isinstance(t, Constant):
                clean_boarder.add(t)
        if len(clean_boarder) <= 3:
            evaluator = set()
            for eva in total:
                if eva in evaluator:
                    continue
                for tb in temp_boarder:
                    if eva.is_descendent_of(tb, level * 2):
                        if maj_mod.get_net(
                                eva.name) is None and eva.name not in skipped:
                            evaluator.add(eva)
                        break
            if len(evaluator) - sum(b.name in skipped
                                    for b in temp_boarder) > score:
                border = temp_boarder
                score = len(evaluator) - sum(b.name in skipped
                                             for b in temp_boarder)
                raw_score = len(evaluator)
                continue
            if len(evaluator) - sum(b.name in skipped
                                    for b in temp_boarder) == score:
                # print(target.name, len(evaluator), score, raw_score, [x.name for x in border], [x.name for x in temp_boarder])
                if len(border) == 0:
                    border = temp_boarder
                    score = len(evaluator) - sum(b.name in skipped
                                                 for b in temp_boarder)
                    raw_score = len(evaluator)
                else:
                    if len(evaluator) > raw_score:
                        border = temp_boarder
                        score = len(evaluator) - sum(b.name in skipped
                                                     for b in temp_boarder)
                        raw_score = len(evaluator)

    if len(border) != 3:
        return {}
    for t in total:
        for b in border:
            if t.is_descendent_of(b, level * 2):
                skipped.add(t.name)
                break
    return border
コード例 #6
0
def majority_mapping(lib: Library, mod: Module):
    for mb in majority_blocks.keys():
        border = [mod.get_net(x.name) for x in majority_blocks[mb][0]]
        selection = majority_blocks[mb][1]
        internal_nets = dict()
        for candidate in set.union(*[b.get_children() for b in border]):
            bdn = set(x.name for x in candidate.get_parents())
            mutual = set.intersection(
                set(x.name for x in candidate.get_parents()),
                set(b.name for b in border))
            if mutual == bdn:
                if candidate.name not in majority_blocks.keys():
                    candidate_inputs = [
                        BooleanVariable(x.connection.name)
                        for x in candidate.source_instance.input_pins
                    ]
                    candidate_truth = candidate.source_instance.truth_value()
                    candidate_boolean = BooleanNode(candidate.name)
                    candidate_boolean.assign(candidate_inputs, candidate_truth)
                    candidate_boolean.reorder([b.name for b in border])
                    pos = [[b.name for b in border].index(x.name)
                           for x in candidate_boolean.inputs]
                    for i in range(40):
                        if majority_primary_truth[
                                i] == candidate_boolean.truth_value and majority_primary_inputs[
                                    i] == pos:
                            internal_nets[i] = candidate
                            break
        min_selection = None
        final_selection = None
        for s in selection:
            temp = set.union(set(int(x / 2) for x in internal_nets.keys()),
                             set(int(x / 2) for x in s))
            if min_selection is None:
                min_selection = temp
                final_selection = s
            else:
                if len(temp) < len(min_selection):
                    min_selection = temp
                    final_selection = s
                    continue
                if len(temp) == len(min_selection):
                    if sum(x > 3 for x in temp) < sum(x > 3
                                                      for x in min_selection):
                        min_selection = temp
                        final_selection = s

        final = list()
        pre_wires = list()
        for c in final_selection:
            if internal_nets.get(c) is None:
                if c % 2 == 1:
                    counter = c - 1
                else:
                    counter = c + 1
                if internal_nets.get(counter) is None:
                    pre_wires.append(None)
                    final.append(True)
                else:
                    pre_wires.append(internal_nets.get(counter))
                    final.append(False)
            else:
                pre_wires.append(internal_nets.get(c))
                final.append(True)

        majority_mapping_single(lib, mod, mod.get_net(mb), border,
                                final_selection, pre_wires, final)