コード例 #1
0
 def __init__(self, parent: Module, source: Wire, delay: int):
     super().__init__("{}_v_buffer".format(source.name), parent)
     buf_out = parent.create_wire()
     org_post = set(source.post)
     for p in org_post:
         p.unbind()
         p.bind(buf_out)
     self._input = PinIn("v_bfr_in", self, source)
     self._output = PinOut("v_bfr_out", self, buf_out)
     self._delay = delay
コード例 #2
0
def insert_port(host: Module):
    for port_in in host.inputs:
        source_port = set(port_in.post).pop()
        interim = host.create_wire()
        source_port.unbind()
        source_port.bind(interim)
        or_a = host.create_wire()
        or_b = host.create_wire()
        host.add_instance("{}_port_xnor_or".format(port_in.name),
                          cell_lib.get("or_bb"), {
                              'a': or_a.name,
                              'b': or_b.name,
                              'c': interim.name
                          })
        xnor_a = host.create_wire()
        xnor_b = host.create_wire()
        host.add_instance("{}_port_xnor_and".format(port_in.name),
                          cell_lib.get("and_bb"), {
                              'a': xnor_a.name,
                              'b': xnor_b.name,
                              'c': or_a.name
                          })
        host.add_instance("{}_port_xnor_and_ii".format(port_in.name),
                          cell_lib.get("and_ii"), {
                              'a': xnor_a.name,
                              'b': xnor_b.name,
                              'c': or_b.name
                          })
        xnor_b_end = xnor_b
        for i in range(4):
            xnor_b = host.create_wire()
            host.register_instance(cell_lib.get_buffer().instantiate(
                "{}_bfr_after".format(xnor_b.name), host,
                [xnor_b, xnor_b_end]))
            xnor_b_end = xnor_b
        host.register_instance(
            cell_lib.get_splitter(2).instantiate(
                "{}_port_splitter".format(port_in.name), host,
                [port_in, xnor_a, xnor_b]))
コード例 #3
0
 def __init__(self,
              parent: Module,
              source: Wire,
              child_wires: Dict[Wire, int] = None):
     super().__init__("{}_v_fanout".format(source.name), parent)
     self._before = 0
     self._tracker = 0
     self._outputs = set()
     self._after = dict()
     if child_wires is None:
         org_post = set(source.post)
         for p in org_post:
             p.unbind()
             split_out_wire = parent.create_wire()
             p.bind(split_out_wire)
             self._add_wire(split_out_wire)
     else:
         for p in child_wires.keys():
             self._add_wire(p, child_wires[p])
     self._input = PinIn("v_fanout_in", self, source)
コード例 #4
0
def majority_mapping_single(lib: Library, mod: Module, target: Wire,
                            border: list, selection: tuple, pre_wire: list,
                            final: list):
    internals = list()
    if len(border) != 3 or len(selection) != 3 or len(final) != 3 or len(
            pre_wire) != 3:
        return
    value = 232
    for i in range(3):
        if selection[i] == 0:
            value = 8
            del final[i]
            continue
        if selection[i] == 1:
            value = 14
            del final[i]
            continue
        if selection[i] < 8:
            internals.append(border[i])
            if majority_primary_truth[selection[i]] == 1:
                final[i] = not final[i]
        else:
            if pre_wire[i] is not None:
                internals.append(pre_wire[i])
            else:
                new_wire = mod.create_wire()
                internals.append(new_wire)
                truth = majority_primary_truth[selection[i]]
                start_border = [
                    border[x] for x in majority_primary_inputs[selection[i]]
                ]
                gate_mapping(mod, new_wire, start_border, truth, lib)
    bn = BooleanNode(target.name)
    inputs = [BooleanVariable(x.name) for x in internals]
    bn.assign(inputs, value)
    for i in range(len(final)):
        if not final[i]:
            bn.negate(inputs[i].name)
    gate_mapping(mod, target, internals, bn.truth_value, lib)