2 from string
import digits
5 # dictionary of properties of signals that are supported.
10 "spi_mosi" : "output",
18 # ============== common bsv templates ============ #
19 assign_cell
= '''cell{0}_out=wrmux{0}=={1}?'''
20 # first argument is the io-cell number being assigned.
21 # second argument is the mux value.
22 # Third argument is the signal from the pinmap file
24 rule assign_{2}_on_cell{0}(wrmux{0}=={1});
28 # ============================================================
30 pinmap_file
= open("./pinmap.txt", "r")
32 for lineno
, line
in enumerate(pinmap_file
):
36 elif("dedicated" in line
):
38 # ==== Logic for muxed pins ==== #
39 if(len(line1
) > 1 and not(dedicated
)):
42 "ERROR: Parameter N_IO(" +
44 ") is less than the pin number in line: " +
48 # ==== Mux each generic IO cell with the mapping ===== #
49 # provided in the pinmap file
50 pinmux
= pinmux
+ " cell" + str(line1
[0]) + "_out="
52 while(i
< len(line1
) - 1):
53 pinmux
= pinmux
+ "wrmux" + \
54 str(line1
[0]) + "==" + str(i
) + "?" + line1
[i
+ 1] + "_io:"
55 if(i
+ 2 == len(line1
) - 1):
56 pinmux
= pinmux
+ line1
[i
+ 2] + "_io"
60 pinmux
= pinmux
+ ";\n"
61 # ======================================================== #
63 # check each cell if "peripheral input/inout" then assign its wire
64 # Here we check the direction of each signal in the dictionary.
65 # We choose to keep the dictionary within the code and not user-input
66 # since the interfaces are always standard and cannot change from
67 # user-to-user. Plus this also reduces human-error as well :)
68 for i
in range(0, len(line1
) - 1):
69 digits
= str.maketrans(dict.fromkeys('0123456789'))
70 temp
= line1
[i
+ 1].translate(digits
)
71 x
= dictionary
.get(temp
)
74 "Error: The signal : " +
77 str(lineno
) + "of pinmap.txt isn't present in the \
78 current dictionary.\nUpdate dictionary or fix-typo.")
82 input_wire
.format(line1
[0], i
, "wr" + line1
[i
+ 1]) + "\n"
85 input_wire
.format(line1
[0], i
, "wr" + line1
[i
+ 1] +
87 # ============================================================ #
89 # ================== Logic for dedicated pins ========= #
90 elif(len(line1
) > 1 and dedicated
):
91 pinmux
= pinmux
+ " cell" + \
92 str(line1
[0]) + "_out=" + line1
[1] + "_io;\n"
93 # ======================================================= #
94 # =========================================================