adding docstring to translate function
[pinmux.git] / src / bsv / 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 # ============== common bsv templates ============ #
9 # first argument is the io-cell number being assigned.
10 # second argument is the mux value.
11 # Third argument is the signal from the pinmap file
12 mux_wire = '''
13 rule assign_{2}_on_cell{0}(wrcell{0}_mux=={1});
14 {2}<=cell{0}_mux_in;
15 endrule
16 '''
17 dedicated_wire = '''
18 rule assign_{1}_on_cell{0};
19 {1}<=cell{0}_mux_in;
20 endrule
21 '''
22 # ============================================================
23 digits = maketrans('0123456789', ' ' * 10) # delete space later
24
25
26 def cn(idx): # idx is an integer
27 return "cell%s_mux" % str(idx)
28
29
30 def transfn(temp):
31 """ removes the number from the string of signal name.
32 """
33 temp = temp.split('_')
34 if len(temp) == 2:
35 temp[0] = temp[0].translate(digits)
36 temp[0] = temp[0] .replace(' ', '')
37 return '_'.join(temp)
38
39
40 def init(p, ifaces):
41 """ generates the actual output pinmux for each io-cell. blank lines
42 need to output "0" to the iopad, if there is no entry in
43 that column.
44 """
45 p.pinmux = ' '
46 global dedicated_wire
47 for cell in p.muxed_cells:
48 p.pinmux += " // output muxer for cell idx %d\n" % cell[0]
49 p.pinmux += " %s_out=" % cn(cell[0])
50 for i in range(0, len(cell) - 2):
51 p.pinmux += "wr%s" % cn(cell[0]) + \
52 "==" + str(i) + "?" + cell[i + 1] + "_io:\n\t\t\t"
53 p.pinmux += cell[i + 2] + "_io"
54 p.pinmux += ";\n"
55 # ======================================================== #
56
57 # check each cell if "peripheral input/inout" then assign its wire
58 # Here we check the direction of each signal in the dictionary.
59 # We choose to keep the dictionary within the code and not user-input
60 # since the interfaces are always standard and cannot change from
61 # user-to-user. Plus this also reduces human-error as well :)
62 for i in range(0, len(cell) - 1):
63 cname = cell[i + 1]
64 temp = transfn(cname)
65 x = ifaces.getifacetype(temp)
66 #print (cname, temp, x)
67 assert x is not None, "ERROR: The signal : " + \
68 str(cname) + \
69 " of pinmap.txt isn't present \nin the current" + \
70 " dictionary. Update dictionary or fix-typo."
71 if x == "input":
72 p.pinmux += \
73 mux_wire.format(cell[0], i, "wr" + cname) + "\n"
74 elif x == "inout":
75 p.pinmux += \
76 mux_wire.format(cell[0], i, "wr" + cname +
77 "_in") + "\n"
78 # ============================================================ #
79
80 # ================== Logic for dedicated pins ========= #
81 for cell in p.dedicated_cells:
82 p.pinmux += " %s_out=%s_io;\n" % (cn(cell[0]), cell[1])
83 temp = cell[1].translate(digits)
84 x = ifaces.getifacetype(temp)
85 if x == "input":
86 pinmux = pinmux + \
87 dedicated_wire.format(cell[0], "wr" + cell[1]) + "\n"
88 elif x == "inout":
89 pinmux = pinmux + \
90 dedicated_wire.format(cell[0], "wr" + cell[1] + "_in") + "\n"
91 # =======================================================#