X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Factual_pinmux.py;h=4d00d34395b9b2d24da747afd117a48f6f6009cd;hb=5820c191f9fc5128fdf8d8df0f3b55120cb0cda4;hp=37c8cdf921347988b9057b8f7eaf9b92ab5ddc46;hpb=c1bf184703c69c8b084b3f7c8c0e3de5a5c77bf8;p=pinmux.git diff --git a/src/actual_pinmux.py b/src/actual_pinmux.py index 37c8cdf..4d00d34 100644 --- a/src/actual_pinmux.py +++ b/src/actual_pinmux.py @@ -1,5 +1,8 @@ -from params import * from string import digits +try: + from string import maketrans +except ImportError: + maketrans = str.maketrans # dictionary of properties of signals that are supported. @@ -11,7 +14,11 @@ dictionary = { "spi_ss" : "output", "spi_miso" : "input", "twi_sda" : "inout", - "twi_scl" : "inout" + "twi_scl" : "inout", + "sd_clk": "output", + "sd_cmd": "output", + "sd_d": "inout", + "pwm_pwm": "output" } @@ -20,68 +27,73 @@ dictionary = { # second argument is the mux value. # Third argument is the signal from the pinmap file mux_wire = ''' - rule assign_{2}_on_cell{0}(wrmux{0}=={1}); - {2}<=cell{0}_in; + rule assign_{2}_on_cell{0}(wrcell{0}_mux=={1}); + {2}<=cell{0}_mux_in; endrule ''' dedicated_wire = ''' rule assign_{1}_on_cell{0}; - {1}<=cell{0}_in; + {1}<=cell{0}_mux_in; endrule ''' # ============================================================ -pinmux = ''' ''' -digits = str.maketrans(dict.fromkeys('0123456789')) +digits = maketrans('0123456789', ' '*10) # delete space later -for cell in muxed_cells: - pinmux = pinmux + " cell" + str(cell[0]) + "_out=" - i = 0 - while(i < len(cell) - 1): - pinmux = pinmux + "wrmux" + \ - str(cell[0]) + "==" + str(i) + "?" + cell[i + 1] + "_io:" - if(i + 2 == len(cell) - 1): - pinmux = pinmux + cell[i + 2] + "_io" - i = i + 2 - else: - i = i + 1 - pinmux = pinmux + ";\n" - # ======================================================== # +def cn(idx): + return "cell%s_mux" % str(idx) - # check each cell if "peripheral input/inout" then assign its wire - # Here we check the direction of each signal in the dictionary. - # We choose to keep the dictionary within the code and not user-input - # since the interfaces are always standard and cannot change from - # user-to-user. Plus this also reduces human-error as well :) - for i in range(0, len(cell) - 1): - temp = cell[i + 1].translate(digits) +def init(p): + p.pinmux = ' ' + global dedicated_wire + for cell in p.muxed_cells: + p.pinmux += " %s_out=" % cn(cell[0]) + i = 0 + while(i < len(cell) - 1): + p.pinmux += "wr%s" % cn(cell[0]) + \ + "==" + str(i) + "?" + cell[i + 1] + "_io:\n\t\t\t" + if(i + 2 == len(cell) - 1): + p.pinmux += cell[i + 2] + "_io" + i = i + 2 + else: + i = i + 1 + p.pinmux += ";\n" + # ======================================================== # + + # check each cell if "peripheral input/inout" then assign its wire + # Here we check the direction of each signal in the dictionary. + # We choose to keep the dictionary within the code and not user-input + # since the interfaces are always standard and cannot change from + # user-to-user. Plus this also reduces human-error as well :) + for i in range(0, len(cell) - 1): + temp = cell[i + 1].translate(digits) + temp = temp.replace(' ', '') + x = dictionary.get(temp) + if(x is None): + print( + "ERROR: The signal : " + + str(cell[i + 1]) + + " of pinmap.txt isn't present in the current dictionary.\ + \nUpdate dictionary or fix-typo.") + exit(1) + if(x == "input"): + p.pinmux += \ + mux_wire.format(cell[0], i, "wr" + cell[i + 1]) + "\n" + elif(x == "inout"): + p.pinmux += \ + mux_wire.format(cell[0], i, "wr" + cell[i + 1] + + "_in") + "\n" + # ============================================================ # + + # ================== Logic for dedicated pins ========= # + for cell in p.dedicated_cells: + p.pinmux += " %s" % cn(cell[0]) + \ + "_out=" + cell[1] + "_io;\n" + temp = cell[1].translate(digits) x = dictionary.get(temp) - if(x is None): - print( - "Error: The signal : " + - str(cell[i + 1]) + - " in lineno: " + - str(lineno) + "of pinmap.txt isn't present in the \ - current dictionary.\nUpdate dictionary or fix-typo.") - exit(1) if(x == "input"): pinmux = pinmux + \ - mux_wire.format(cell[0], i, "wr" + cell[i + 1]) + "\n" + dedicated_wire.format(cell[0], "wr" + cell[1]) + "\n" elif(x == "inout"): pinmux = pinmux + \ - mux_wire.format(cell[0], i, "wr" + cell[i + 1] + - "_in") + "\n" -# ============================================================ # - -# ================== Logic for dedicated pins ========= # -for cell in dedicated_cells: - pinmux = pinmux + " cell" + \ - str(cell[0]) + "_out=" + cell[1] + "_io;\n" - temp = cell[1].translate(digits) - x = dictionary.get(temp) - if(x == "input"): - pinmux = pinmux + \ - dedicated_wire.format(cell[0], "wr" + cell[1]) + "\n" - elif(x == "inout"): - pinmux = pinmux + \ - dedicated_wire.format(cell[0], "wr" + cell[1] + "_in") + "\n" -# =======================================================# + dedicated_wire.format(cell[0], "wr" + cell[1] + "_in") + "\n" + # =======================================================#