X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fparse.py;h=16927efa841235a3d27c110def4e7868b9fea02c;hb=febcb1bce0ee80ab7e5f4c496e92009e02e3ef43;hp=babf31d469c8d70d6ed86ee7fe1cab528911ea92;hpb=3c9f40523337a03bff4657ca76cb2ce690c45bc5;p=pinmux.git diff --git a/src/parse.py b/src/parse.py index babf31d..16927ef 100644 --- a/src/parse.py +++ b/src/parse.py @@ -1,31 +1,5 @@ import math -# == Parameters == # -N_MUX = 1 # number of selection lines for the mux per io -N_IO = 0 -N_MUX_IO = 0 -N_UART = 4 -N_SPI = 1 -N_TWI = 2 -N_SD = 2 -N_JTAG = 2 -Addressing = 'WORD' -ADDR_WIDTH = 32 -DATA_WIDTH = 32 -# ================ # - -# Generating the number of bits for memory map # -lower_offset = 0 -if(Addressing == 'BYTE'): - lower_offset = 0 -elif(Addressing == 'HWORD'): - lower_offset = 1 -elif(Addressing == 'WORD'): - lower_offset = 2 -elif(Addressing == 'DWORD'): - lower_offset = 3 -else: - print('ERROR: Addressing should be one of: BYTE, HWORD, WORD, DWORD') - exit(1) +import os.path def missing_numbers(num_list): @@ -34,56 +8,114 @@ def missing_numbers(num_list): return (list(num_list ^ set(original_list))) -# == capture the number of IO cells required == # -pinmapfile = open('pinmap.txt', 'r') -max_io = 0 -muxed_cells = [] -dedicated_cells = [] -pinnumbers = [] -for lineno, line in enumerate(pinmapfile): - line1 = line.split() - if(len(line1) > 1): - pinnumbers.append(int(line1[0])) - if(len(line1) == 2): # dedicated - dedicated_cells.append(line1) - if(len(line1) > 2): - muxed_cells.append(line1) -pinnumbers = sorted(pinnumbers) - -upper_offset = lower_offset + int(math.log(len(muxed_cells), 2)) -# ============================================= # -# ======= Multiple checks to see if the user has not screwed ======# -missing_pins = missing_numbers(pinnumbers) - -# Check-1: ensure that no pin is present in both muxed and dedicated pins -for muxcell in muxed_cells: - for dedcel in dedicated_cells: - if(dedcel[1] in muxcell): - print("ERROR: " + str(dedcel[1]) + " present \ - in dedicated & muxed lists") +class Parse(object): + # == Parameters == # + N_MUX = 1 # number of selection lines for the mux per io + N_IO = 0 + N_MUX_IO = 0 + Addressing = 'WORD' + ADDR_WIDTH = 64 # TODO parameterise + PADDR_WIDTH = 32 # TODO parameterise + DATA_WIDTH = 64 # TODO parameterise + # ================ # + + # Generating the number of bits for memory map # + lower_offset = 0 + if Addressing == 'BYTE': + lower_offset = 0 + elif Addressing == 'HWORD': + lower_offset = 1 + elif Addressing == 'WORD': + lower_offset = 2 + elif Addressing == 'DWORD': + lower_offset = 3 + else: + print('ERROR: Addressing should be one of: BYTE, HWORD, WORD, DWORD') + exit(1) + + def __init__(self, pth=None, verify=True): + + max_io = 0 + self.muxed_cells = [] + self.dedicated_cells = [] + self.pinnumbers = [] + + # == capture the number of IO cells required == # + fname = 'pinmap.txt' + if pth: + fname = os.path.join(pth, fname) + with open(fname) as pinmapfile: + for lineno, line in enumerate(pinmapfile): + line1 = line[:-1].split('\t') + if len(line1) <= 1: + continue + self.pinnumbers.append(int(line1[0])) + # XXX TODO: dedicated pins in separate file + #if len(line1) == 2: # dedicated + # self.dedicated_cells.append(line1) + #else: + for i in range(1, len(line1)): + # XXX HORRIBLE HACK!! + if line1[i].startswith('pwm'): + line1[i] = 'pwm%s_out' % line1[i][4:] + self.muxed_cells.append(line1) + + self.pinnumbers = sorted(self.pinnumbers) + self.upper_offset = self.lower_offset + \ + int(math.log(len(self.muxed_cells), 2)) + + if verify: + self.do_checks() + + self.cell_bitwidth = self.get_cell_bit_width() + + # == user info after parsing ================= # + self.N_IO = len(self.dedicated_cells) + len(self.muxed_cells) + print("Max number of IO: " + str(self.N_IO)) + print("Muxer bit width: " + str(self.cell_bitwidth)) + print("Muxed IOs: " + str(len(self.muxed_cells))) + print("Dedicated IOs: " + str(len(self.dedicated_cells))) + + def do_checks(self): + """ Multiple checks to see if the user has not screwed up + """ + missing_pins = missing_numbers(self.pinnumbers) + + # Check-1: ensure no pin is present in both muxed and dedicated pins + for muxcell in self.muxed_cells: + for dedcel in self.dedicated_cells: + if dedcel[1] in muxcell: + print("ERROR: " + str(dedcel[1]) + " present \ + in dedicated & muxed lists") + exit(1) + + # Check-2: if pin numbering is consistent: + if missing_pins: + print("ERROR: Following pins have no assignment: " + + str(missing_numbers(self.pinnumbers))) + exit(1) + unique = set(self.pinnumbers) + duplicate = False + for each in unique: + count = self.pinnumbers.count(each) + if count > 1: + print("ERROR: Multiple assignment for pin: " + str(each)) + duplicate = True + if duplicate: exit(1) -# Check-2: if pin numbering is consistent: -if missing_pins: - print("ERROR: Following pins have no assignment: " + - str(missing_numbers(pinnumbers))) - exit(1) -unique = set(pinnumbers) -duplicate = False -for each in unique: - count = pinnumbers.count(each) - if(count > 1): - print("ERROR: Multiple assignment for pin: " + str(each)) - duplicate = True -if(duplicate): - exit(1) - -# Check-2: confirm if N_* matches the instances in the pinmap -# ============================================================== # - -# == user info after parsin ================= # -N_IO = len(dedicated_cells) + len(muxed_cells) -print("Max number of IO: " + str(N_IO)) -print("Muxed IOs: " + str(len(muxed_cells))) -print("Dedicated IOs: " + str(len(dedicated_cells))) -# ============================================ # + # Check-3: confirm if N_* matches the instances in the pinmap + # ============================================================== # + + # TODO + + def get_cell_bit_width(self): + max_num_cells = 0 + for cell in self.muxed_cells: + max_num_cells = max(len(cell) - 1, max_num_cells) + return int(math.log(max_num_cells + 1, 2)) + + +if __name__ == '__main__': + p = Parse() + print (p.N_IO)