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(' ', '')
39 def fmt(ifaces
, cell
):
40 """ blank entries need to output a 0 to the pin (it could just as
41 well be a 1 but we choose 0). reason: blank entries in
42 the pinmap.txt file indicate that there's nothing to choose
43 from. however the user may still set the muxer to that value,
44 and rather than throw an exception we choose to output... zero.
46 empty
= '0' # XXX TODO: fix this, as it's assigned to GenericIOType
49 # work out the type. if it's an input, return empty
50 temp
= cell
[1].translate(digits
)
51 x
= ifaces
.getifacetype(temp
)
57 """ generates the actual output pinmux for each io-cell. blank lines
58 need to output "0" to the iopad, if there is no entry in
63 for cell
in p
.muxed_cells
:
64 p
.pinmux
+= " // output muxer for cell idx %s\n" % cell
[0]
65 p
.pinmux
+= " %s_out=" % cn(cell
[0])
66 for i
in range(0, len(cell
) - 2):
67 p
.pinmux
+= "wr%s" % cn(cell
[0]) + \
68 "==" + str(i
) + "?" + fmt(ifaces
, cell
[i
+ 1]) + ":\n\t\t\t"
69 p
.pinmux
+= fmt(ifaces
, cell
[i
+ 2])
71 # ======================================================== #
73 # check each cell if "peripheral input/inout" then assign its wire
74 # Here we check the direction of each signal in the dictionary.
75 # We choose to keep the dictionary within the code and not user-input
76 # since the interfaces are always standard and cannot change from
77 # user-to-user. Plus this also reduces human-error as well :)
78 for i
in range(0, len(cell
) - 1):
80 if not cname
: # skip blank entries, no need to test
83 x
= ifaces
.getifacetype(temp
)
84 #print (cname, temp, x)
85 assert x
is not None, "ERROR: The signal : " + \
87 " of pinmap.txt isn't present \nin the current" + \
88 " dictionary. Update dictionary or fix-typo."
91 mux_wire
.format(cell
[0], i
, "wr" + cname
) + "\n"
94 mux_wire
.format(cell
[0], i
, "wr" + cname
+
96 # ============================================================ #
98 # ================== Logic for dedicated pins ========= #
99 for cell
in p
.dedicated_cells
:
100 p
.pinmux
+= " %s_out=%s_io;\n" % (cn(cell
[0]), cell
[1])
101 temp
= cell
[1].translate(digits
)
102 x
= ifaces
.getifacetype(temp
)
105 dedicated_wire
.format(cell
[0], "wr" + cell
[1]) + "\n"
108 dedicated_wire
.format(cell
[0], "wr" + cell
[1] + "_in") + "\n"
109 # =======================================================#