partial support for dedicated pins
[pinmux.git] / src / actual_pinmux.py
1 from params import *
2 from string import digits
3
4
5 ## dictionary of properties of signals that are supported.
6 dictionary={
7 "uart_rx" :"input",
8 "uart_tx" :"output",
9 "spi_sclk" :"output",
10 "spi_mosi" :"output",
11 "spi_ss" :"output",
12 "spi_miso" :"input",
13 "twi_sda" :"inout",
14 "twi_scl" :"inout"
15 }
16
17
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
23 input_wire='''
24 rule assign_{2}_on_cell{0}(wrmux{0}=={1});
25 {2}<=cell{0}_in;
26 endrule
27 '''
28 #########################################
29 pinmux=''' '''
30 pinmap_file=open("./pinmap.txt","r")
31 dedicated=False
32 for lineno,line in enumerate(pinmap_file):
33 line1=line.split()
34 if("muxed" in line):
35 dedicated=False
36 elif("dedicated" in line):
37 dedicated=True
38 ############################## Logic for muxed pins ##############################
39 if(len(line1)>1 and not(dedicated)):
40 if(lineno>N_IO):
41 print("ERROR: Parameter N_IO("+str(N_IO)+") is less than the pin number in line: "+str(lineno)+" of pinmap.txt")
42 exit(1)
43 ######## Mux each generic IO cell with the mapping######
44 # provided in the pinmap file
45 pinmux=pinmux+" cell"+str(line1[0])+"_out="
46 i=0
47 while(i<len(line1)-1):
48 pinmux=pinmux+"wrmux"+str(line1[0])+"=="+str(i)+"?"+line1[i+1]+"_io:"
49 if(i+2==len(line1)-1):
50 pinmux=pinmux+line1[i+2]+"_io"
51 i=i+2
52 else:
53 i=i+1
54 pinmux=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 user-to-user.
61 ## Plus this also reduces human-error as well :)
62 for i in range(0,len(line1)-1):
63 digits = str.maketrans(dict.fromkeys('0123456789'))
64 temp=line1[i+1].translate(digits)
65 x=dictionary.get(temp);
66 if(x==None):
67 print("Error: The signal : "+str(line1[i+1])+" in lineno: "+str(lineno)+"of pinmap.txt is not present in the current dictionary.\nSoln: Either update the dictionary or fix typo.")
68 exit(1)
69 if(x=="input"):
70 pinmux=pinmux+input_wire.format(line1[0],i,"wr"+line1[i+1])+"\n"
71 elif(x=="inout"):
72 pinmux=pinmux+input_wire.format(line1[0],i,"wr"+line1[i+1]+"_in")+"\n"
73 ################################################################################
74
75 ############################## Logic for dedicated pins ##############################
76 elif(len(line1)>1 and dedicated):
77 pinmux=pinmux+" cell"+str(line1[0])+"_out="+line1[1]+"_io;\n"
78 ###########################################
79