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