Exemple #1
0
def new_decoder(number_ins, is_dual):
    ins = []
    for index in range(number_ins):
        ins.append('in_'+str(index))
    number_outs = power(number_ins)
    outs = []
    for index in range(number_outs):
        outs.append('o_'+str(index))
    return new_boolean(ins,outs, decoder_truth, 'decoder_'+str(number_ins))
Exemple #2
0
def new_mux_bad(number_selects, is_dual=False, in_pre='in', select_pre='select', out='out'):
    number_ins = power(number_selects)
    ins = []
    for index in range(number_ins):
        ins.append('in_'+str(index))
    for index in range(number_selects):
        ins.append('select_'+str(index))
    outs = ['out']

    return new_boolean(ins,outs, mux_truth, 'mux_'+str(number_ins))
Exemple #3
0
def new_tree_mux_help(select_sets, devices, wires, level, index=0, parent_index=0):
    select_set = select_sets[level]
    number_selects = len(select_set)
    num_ins = power(number_selects)
    sindex = str(index)

    parent_name = 'mux_'+str(level+1)+'_'+str(parent_index)
    if (level <= -1):
        # create input links
        ins_per_zero = power(len(select_sets[0]))
        parent_in = index%ins_per_zero
        in_name = 'in'+sindex
        append_bridge(devices, in_name)
        wire = set_wire(wires, 'wire_'+in_name,[in_name],[parent_name+'/in'+str(parent_in)])
        return

    name = 'mux_'+str(level)+'_'+str(index)
    mux = {
        'type': 'mux'+str(number_selects),
        'name': name
    }

    # now hookup selects to device selects.
    for idx, select in enumerate(select_set):
        wire = wires['wire_'+select]
        wire['to'].append(name+'/select'+str(idx))

    # wire from output to parent's input
    if level >= len(select_sets) - 1:
        #parent set.
        append_bridge(devices, 'out')
        set_wire(wires, 'wire_'+name, [name+'/out'], ['out'])
    else:
        set_wire(wires, 'wire_'+name, [name+'/out'], [parent_name+'/in'+str(index)])


    devices.append(mux)
    child_range = [index*num_ins, (index+1)*num_ins]
    for child_index in range(*child_range):
        new_tree_mux_help(select_sets, devices, wires, level-1, child_index, index)
Exemple #4
0
def get_selects(total):
    '''
    inputs = 2^selects
    2^selects + selects = total
    '''
    current = 0
    selects = 1
    while(True):
        current = power(selects) + selects
        if current >= total:
            break
        selects += 1

    return selects
Exemple #5
0
def new_tree_decoder_help(ranges, devices, wires, parent_index=0, level=0, index=0):
    sindex = str(index)
    '''
    Root parent is one decoder and starts at level 0.
    Ranges is a list of input index i.e [(0,2),(2,6)]
    '''

    # if not root, create wire from parent to self.
    if level>0:
        sparentl = str(parent_index)
        ins_per_parent = ranges[level-1][1] - ranges[level-1][0]
        outs_per_parent = power(ins_per_parent)
        out_index = index %outs_per_parent
        parent_name = 'decoder_'+str(level-1)+'_'+ sparentl+'/out'+str(out_index)
        wire_name = 'wiredecoder'+str(level-1)+'_'+ sparentl
        set_wire(wires,  wire_name, [parent_name],[])
        wire = wires[wire_name]


    # if past last level, make outputs
    if level >= len(ranges):
        # write outputs
        out_name = 'out'+str(index)
        append_bridge(devices, out_name)
        wire['to'].append(out_name)
        return

    in_range = ranges[level]
    num_ins= in_range[1] - in_range[0]
    slevel = str(level)
    num_outs = power(num_ins)
    # wire from parent output

    name = 'decoder_'+slevel+'_'+sindex
   
    # level < end
    decoder = {
        'type': 'decoder'+str(num_ins),
        'name': name
    }
    devices.append(decoder)

    if level>0:
        for idx, offset in enumerate(range(*in_range)):
            i = str(idx)
            soff = str(offset)
            and_name = 'and_'+slevel+'_'+sindex+'_'+i
            and_device = new_device(and_name, 'and2')
            devices.append(and_device)
            wire['to'].append(and_name+'/in0')

            in_name = 'in'+ soff
            in_wire = wires['wire'+in_name]
            in_wire['to'].append(and_name+'/in1')
            set_wire(wires, 'wire'+and_name, [and_name+'/out'], [name+'/in'+i])
    else:
        # root level. input to decoder input
        for offset in range(*in_range):
            in_name = 'in'+ str(offset)
            in_wire = wires['wire'+in_name]
            in_wire['to'].append(name+'/in'+str(offset))

    child_range = [index*num_outs, (index+1)*num_outs]
    for child_index in range(*child_range):
        new_tree_decoder_help(ranges, devices, wires, index, level+1, child_index)