def readFileObject(fobj):
    "Reads a bench file and returns the tuple (inps, outs, node_map)."
    fanins = {}
    node_map = {}
    output_names = []
    inputs = []
    for l in fobj.readlines():
        f = []
        l = l.strip()
        if len(l) == 0 or l.startswith('#'):
            continue
        if 'INPUT(' in l:
            name = l.replace("INPUT(", "").replace(")", "")
            node = ckt.InputNode(name)
            node_map[name] = node
            inputs.append(node)
        elif 'OUTPUT(' in l:
            name = l.replace("OUTPUT(", "").replace(")", "")
            output_names.append(name)
        elif '=' in l:
            parts = [p.strip() for p in l.split('=')]
            assert len(parts) == 2
            gate_name = parts[0]
            rhs = parts[1]
            if rhs == 'VDD':
                node_map[gate_name] = ckt.Const1Node()
            else:
                gate_type = rhs[:rhs.find('(')]
                within_bracket = rhs[rhs.find('(')+1:rhs.find(')')]
                fanin_names = [p.strip() for p in within_bracket.split(',')]
                fanins = [node_map[fn] for fn in fanin_names]
                if gate_type == 'AND':
                    g = ckt.AndGate(*fanins)
                elif gate_type == 'OR':
                    g = ckt.OrGate(*fanins)
                elif gate_type == 'NOT':
                    g = ckt.NotGate(*fanins)
                elif gate_type == 'XOR':
                    g = ckt.XorGate(*fanins)
                elif gate_type == 'XNOR':
                    g = ckt.XnorGate(*fanins)
                elif gate_type == 'NAND':
                    g = ckt.NandGate(*fanins)
                elif gate_type == 'NOR':
                    g = ckt.NorGate(*fanins)
                elif gate_type == 'BUF' or gate_type == 'BUFF':
                    g = ckt.BufGate(*fanins)
                else:
                    assert False, gate_type
                node_map[gate_name] = g
                g.name = gate_name
        else:
            assert False, l
    outputs = []
    for out_name in output_names:
        output = node_map[out_name]
        output.name = out_name
        outputs.append(output)

    return inputs, outputs, node_map
Example #2
0
def is_fru(tuples, node):
    mit = ckt.Const0Node()
    nsupp = node.support()
    isupp = set()
    seltuples = []
    for (n, ci, ki) in tuples:
        if ci in nsupp and ki in nsupp:
            isupp.add(ci)
            isupp.add(ki)
            seltuples.append((ci, ki))

    print(len(nsupp), len(isupp))
    print(nsupp)
    print(isupp)
    assert isupp == nsupp
    print('# of pairs of inputs in support: ' % len(seltuples))
    for (ci, ki) in seltuples:
        eq = (ci ^ ki)
        mit = mit | eq
    comp = ckt.NotGate(mit)
    miter = (node ^ comp)
    S = Solver()
    nmap = {}
    clauses = adapter.circuitToCNF(miter, nmap, lambda n: S.newVar())
    for cl in clauses:
        S.addClause(*cl)
    r1 = S.solve(nmap[miter])
    if r1 == False: return True
    r2 = S.solve(-nmap[miter])
    if r2 == False: return True
Example #3
0
def is_unate(gate):
    s = Solver()
    supports = gate.support()

    #print supports
    def newVar(n):
        return s.newVar()

    for inp in supports:
        s.push()
        node_to_literal_0 = {}
        node_to_literal_1 = {}
        for sup in supports:
            if sup != inp:
                node_to_literal_0[sup] = newVar(0)
                node_to_literal_1[sup] = node_to_literal_0[sup]

        ckt1 = ckt.NotGate(gate)
        ckt_cnf_0 = adapter.circuitToCNF(gate, node_to_literal_0, newVar)
        ckt_cnf_1 = adapter.circuitToCNF(gate, node_to_literal_1, newVar)
        for clause in ckt_cnf_0 + ckt_cnf_1:
            s.addClause(*clause)
        # Check counter example for positive unateness
        r1 = s.solve(-node_to_literal_0[inp], node_to_literal_1[inp],
                     node_to_literal_0[gate], -node_to_literal_1[gate])
        if r1:
            # Check counter example for negative unateness
            r2 = s.solve(-node_to_literal_0[inp], node_to_literal_1[inp],
                         -node_to_literal_0[gate], node_to_literal_1[gate])
            if r2:
                return False

        s.pop()
    return True
Example #4
0
def is_xnor(n):
    support = n.support()
    if len(support) != 2:
        return False
    support = list(support)
    support.sort(key=lambda n: n.is_keyinput())
    if support[0].is_keyinput() or (not support[1].is_keyinput()):
        return False
    x0, x1 = support[0], support[1]
    miter = ckt.NotGate(n ^ (x0 ^ x1))
    nmap = {}
    S = Solver()
    clauses = adapter.circuitToCNF(miter, nmap, lambda n: S.newVar())
    for cl in clauses:
        S.addClause(*cl)
    r1 = S.solve(nmap[miter])
    if r1 == False:
        return True
    else:
        return False
Example #5
0
def is_cubestripper(gate, ps):
    # solver object
    s = Solver()

    # new variable.
    def newVar(n):
        return s.newVar()

    unates = []
    for inp in ps:
        s.push()
        # create clauses.
        node_to_literal_0 = {}
        node_to_literal_1 = {}
        for sup in ps:
            if sup != inp:
                node_to_literal_0[sup] = newVar(0)
                node_to_literal_1[sup] = node_to_literal_0[sup]

        ckt1 = ckt.NotGate(gate)
        ckt_cnf_0 = adapter.circuitToCNF(gate, node_to_literal_0, newVar)
        ckt_cnf_1 = adapter.circuitToCNF(gate, node_to_literal_1, newVar)
        for clause in ckt_cnf_0 + ckt_cnf_1:
            s.addClause(*clause)
        # Check counter example for positive unateness
        r1 = s.solve(-node_to_literal_0[inp], node_to_literal_1[inp],
                     node_to_literal_0[gate], -node_to_literal_1[gate])
        if r1:
            # Check counter example for negative unateness
            r2 = s.solve(-node_to_literal_0[inp], node_to_literal_1[inp],
                         -node_to_literal_0[gate], node_to_literal_1[gate])
            if r2:
                return False, None
            else:
                unates.append(0)
        else:
            unates.append(1)
        s.pop()
    return True, unates