ce1797d823b72faa54eb557a063ffc23079b12b2
[pinmux.git] / src / actual_pinmux.py
1 from string import digits
2 try:
3 from string import maketrans
4 except ImportError:
5 maketrans = str.maketrans
6
7
8 # dictionary of properties of signals that are supported.
9 dictionary = {
10 "uart_rx" : "input",
11 "uart_tx" : "output",
12 "spi_sclk" : "output",
13 "spi_mosi" : "output",
14 "spi_ss" : "output",
15 "spi_miso" : "input",
16 "twi_sda" : "inout",
17 "twi_scl" : "inout",
18 "sd_clk": "output",
19 "sd_cmd": "output",
20 "sd_d": "inout",
21 "pwm_pwm": "output"
22 }
23
24
25 # ============== common bsv templates ============ #
26 # first argument is the io-cell number being assigned.
27 # second argument is the mux value.
28 # Third argument is the signal from the pinmap file
29 mux_wire = '''
30 rule assign_{2}_on_cell{0}(wrcell{0}_mux=={1});
31 {2}<=cell{0}_mux_in;
32 endrule
33 '''
34 dedicated_wire = '''
35 rule assign_{1}_on_cell{0};
36 {1}<=cell{0}_mux_in;
37 endrule
38 '''
39 # ============================================================
40 digits = maketrans('0123456789', ' '*10) # delete space later
41
42
43 def cn(idx):
44 return "cell%s_mux" % str(idx)
45
46
47 def init(p):
48 p.pinmux = ' '
49 global dedicated_wire
50 for cell in p.muxed_cells:
51 p.pinmux += " %s_out=" % cn(cell[0])
52 i = 0
53 while(i < len(cell) - 1):
54 p.pinmux += "wr%s" % cn(cell[0]) + \
55 "==" + str(i) + "?" + cell[i + 1] + "_io:\n\t\t\t"
56 if(i + 2 == len(cell) - 1):
57 p.pinmux += cell[i + 2] + "_io"
58 i = i + 2
59 else:
60 i = i + 1
61 p.pinmux += ";\n"
62 # ======================================================== #
63
64 # check each cell if "peripheral input/inout" then assign its wire
65 # Here we check the direction of each signal in the dictionary.
66 # We choose to keep the dictionary within the code and not user-input
67 # since the interfaces are always standard and cannot change from
68 # user-to-user. Plus this also reduces human-error as well :)
69 for i in range(0, len(cell) - 1):
70 temp = cell[i + 1].translate(digits)
71 temp = temp.replace(' ', '')
72 x = dictionary.get(temp)
73 if(x is None):
74 print(
75 "ERROR: The signal : " +
76 str(cell[i + 1]) +
77 " of pinmap.txt isn't present in the current dictionary.\
78 \nUpdate dictionary or fix-typo.")
79 exit(1)
80 if(x == "input"):
81 p.pinmux += \
82 mux_wire.format(cell[0], i, "wr" + cell[i + 1]) + "\n"
83 elif(x == "inout"):
84 p.pinmux += \
85 mux_wire.format(cell[0], i, "wr" + cell[i + 1] +
86 "_in") + "\n"
87 # ============================================================ #
88
89 # ================== Logic for dedicated pins ========= #
90 for cell in p.dedicated_cells:
91 p.pinmux += " %s" % cn(cell[0]) + \
92 "_out=" + cell[1] + "_io;\n"
93 temp = cell[1].translate(digits)
94 x = dictionary.get(temp)
95 if(x == "input"):
96 pinmux = pinmux + \
97 dedicated_wire.format(cell[0], "wr" + cell[1]) + "\n"
98 elif(x == "inout"):
99 pinmux = pinmux + \
100 dedicated_wire.format(cell[0], "wr" + cell[1] + "_in") + "\n"
101 # =======================================================#