Exemplo n.º 1
0
def half_adder(fault=True):
    ####################################################################################################
    # get basic gate fault models
    ####################################################################################################

    # print("XOR gate fault model")
    pmodel_xor = gate_model('XOR', fault)

    # print("AND gate fault model")
    pmodel_and = gate_model('AND', fault)

    ####################################################################################################
    # wire the whole thing up
    ####################################################################################################

    models = []
    labels = {}

    labels_xor, _ = GATES['XOR']
    labels['XOR'] = ('augend', 'addend', 'sum')
    models.append(new_pmodel(pmodel_xor, labels_xor, labels['XOR']))

    labels_and, _ = GATES['AND']
    labels['AND'] = ('augend', 'addend', 'carry_out')
    models.append(new_pmodel(pmodel_and, labels_and, labels['AND']))

    ####################################################################################################
    # combine into one binary quadratic model
    ####################################################################################################

    bqm = stitch(models)
    # print("half adder fault model")
    # print('h: {}'.format(bqm.linear))
    # print('J: {}\n'.format(bqm.quadratic))
    return (bqm, labels)
Exemplo n.º 2
0
def full_adder(fault=True):
    ####################################################################################################
    # get basic gate fault models
    ####################################################################################################

    # print("half adder fault model")
    pmodel_half_add = gate_model('HALF_ADD', fault)

    # print("OR gate fault model")
    pmodel_or = gate_model('OR', fault)

    ####################################################################################################
    # wire the whole thing up
    ####################################################################################################

    models = []
    labels = {}

    labels_half_add, _ = GATES['HALF_ADD']
    labels['HALF_ADD'] = {}

    labels['HALF_ADD']['add1'] = ('augend', 'addend', 'sum1', 'carry_out1')
    labels['HALF_ADD']['add2'] = ('sum1', 'carry_in', 'sum', 'carry_out2')

    models.append(
        new_pmodel(pmodel_half_add, labels_half_add,
                   labels['HALF_ADD']['add1']))
    models.append(
        new_pmodel(pmodel_half_add, labels_half_add,
                   labels['HALF_ADD']['add2']))

    labels_or, _ = GATES['OR']
    labels['OR'] = {}
    labels['OR']['or'] = ('carry_out1', 'carry_out2', 'carry_out')
    models.append(new_pmodel(pmodel_or, labels_or, labels['OR']['or']))

    ####################################################################################################
    # combine into one binary quadratic model
    ####################################################################################################

    bqm = stitch(models)
    # print("full adder fault model")
    # print('h: {}'.format(bqm.linear))
    # print('J: {}\n'.format(bqm.quadratic))
    return (bqm, labels)
Exemplo n.º 3
0
def three_bit_multiplier(fault=True):
    ####################################################################################################
    # get basic gate fault models
    ####################################################################################################

    # print("AND gate fault model")
    pmodel_and = gate_model('AND', fault)

    # print("half adder fault model")
    pmodel_half_add = gate_model('HALF_ADD', fault)

    # print("full adder fault model")
    pmodel_full_add = gate_model('FULL_ADD', fault)

    ####################################################################################################
    # wire the whole thing up
    ####################################################################################################

    models = []
    labels = {}

    #                            a2 & b0  a1 & b0  a0 & b0
    #                   a2 & b1  a1 & b1  a0 & b1
    #          a2 & b2  a1 & b2  a0 & b2
    # ────────────────────────────────────────────────────
    #    p5       p4       p3       p2       p1       p0

    #                      and20  and10  and00
    #               and21  and11  and01
    #        and22  and12  and02
    # ────────────────────────────────────────
    #   p5     p4     p3     p2     p1     p0

    labels_and, _ = GATES['AND']
    labels['AND'] = {}

    labels['AND']['and00'] = ('a0', 'b0', 'p0')
    labels['AND']['and01'] = ('a0', 'b1', 'and01')
    labels['AND']['and02'] = ('a0', 'b2', 'and02')
    labels['AND']['and10'] = ('a1', 'b0', 'and10')
    labels['AND']['and11'] = ('a1', 'b1', 'and11')
    labels['AND']['and12'] = ('a1', 'b2', 'and12')
    labels['AND']['and20'] = ('a2', 'b0', 'and20')
    labels['AND']['and21'] = ('a2', 'b1', 'and21')
    labels['AND']['and22'] = ('a2', 'b2', 'and22')

    models.append(new_pmodel(pmodel_and, labels_and, labels['AND']['and00']))
    models.append(new_pmodel(pmodel_and, labels_and, labels['AND']['and01']))
    models.append(new_pmodel(pmodel_and, labels_and, labels['AND']['and02']))
    models.append(new_pmodel(pmodel_and, labels_and, labels['AND']['and10']))
    models.append(new_pmodel(pmodel_and, labels_and, labels['AND']['and11']))
    models.append(new_pmodel(pmodel_and, labels_and, labels['AND']['and12']))
    models.append(new_pmodel(pmodel_and, labels_and, labels['AND']['and20']))
    models.append(new_pmodel(pmodel_and, labels_and, labels['AND']['and21']))
    models.append(new_pmodel(pmodel_and, labels_and, labels['AND']['and22']))

    #                                         and20         and10         and00
    #                                           |             |             |
    #                           and21         add11──and11  add01──and01    |
    #                             |┌───────────┘|┌───────────┘|             |
    #             and22         add12──and12  add02──and02    |             |
    #               |┌───────────┘|┌───────────┘|             |             |
    #             add13─────────add03           |             |             |
    #  ┌───────────┘|             |             |             |             |
    # p5            p4            p3            p2            p1            p0

    labels_half_add, _ = GATES['HALF_ADD']
    labels['HALF_ADD'] = {}

    labels['HALF_ADD']['add01'] = ('and01', 'and10', 'p1', 'carry01')
    labels['HALF_ADD']['add03'] = ('carry02', 'sum12', 'p3', 'carry03')
    labels['HALF_ADD']['add11'] = ('and11', 'and20', 'sum11', 'carry11')

    models.append(
        new_pmodel(pmodel_half_add, labels_half_add,
                   labels['HALF_ADD']['add01']))
    models.append(
        new_pmodel(pmodel_half_add, labels_half_add,
                   labels['HALF_ADD']['add03']))
    models.append(
        new_pmodel(pmodel_half_add, labels_half_add,
                   labels['HALF_ADD']['add11']))

    labels_full_add, _ = GATES['FULL_ADD']
    labels['FULL_ADD'] = {}

    labels['FULL_ADD']['add02'] = ('and02', 'sum11', 'carry01', 'p2',
                                   'carry02')
    labels['FULL_ADD']['add12'] = ('and12', 'and21', 'carry11', 'sum12',
                                   'carry12')
    labels['FULL_ADD']['add13'] = ('carry03', 'and22', 'carry12', 'p4', 'p5')

    models.append(
        new_pmodel(pmodel_full_add, labels_full_add,
                   labels['FULL_ADD']['add02']))
    models.append(
        new_pmodel(pmodel_full_add, labels_full_add,
                   labels['FULL_ADD']['add12']))
    models.append(
        new_pmodel(pmodel_full_add, labels_full_add,
                   labels['FULL_ADD']['add13']))

    ####################################################################################################
    # combine into one binary quadratic model
    ####################################################################################################

    bqm = stitch(models)
    # print("three-bit multiplier fault model")
    # print('h: {}'.format(bqm.linear))
    # print('J: {}\n'.format(bqm.quadratic))
    return (bqm, labels)