1 from string
import digits
3 from string
import maketrans
5 maketrans
= str.maketrans
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
13 rule assign_{2}_on_cell{0}(wrcell{0}_mux=={1});
18 rule assign_{1}_on_cell{0};
22 # ============================================================
23 digits
= maketrans('0123456789', ' ' * 10) # delete space later
26 def cn(idx
): # idx is an integer
27 return "cell%s_mux" % str(idx
)
31 """ removes the number from the string of signal name.
33 temp
= temp
.split('_')
35 temp
[0] = temp
[0].translate(digits
)
36 temp
[0] = temp
[0] .replace(' ', '')
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
47 for cell
in p
.muxed_cells
:
48 p
.pinmux
+= " // output muxer for cell idx %s\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"
55 # ======================================================== #
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):
65 x
= ifaces
.getifacetype(temp
)
66 #print (cname, temp, x)
67 assert x
is not None, "ERROR: The signal : " + \
69 " of pinmap.txt isn't present \nin the current" + \
70 " dictionary. Update dictionary or fix-typo."
73 mux_wire
.format(cell
[0], i
, "wr" + cname
) + "\n"
76 mux_wire
.format(cell
[0], i
, "wr" + cname
+
78 # ============================================================ #
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
)
87 dedicated_wire
.format(cell
[0], "wr" + cell
[1]) + "\n"
90 dedicated_wire
.format(cell
[0], "wr" + cell
[1] + "_in") + "\n"
91 # =======================================================#