add io option to Pin
[pinmux.git] / src / interface_decl.py
1 # ========= Interface declarations ================ #
2 mux_interface = '''
3 method Action cell{0}_mux(Bit#({1}) in);'''
4
5 io_interface = '''
6 (*always_ready*) method Bit#(1) io_outputval_{0};
7 (*always_ready*) method Bit#(1) io_output_en_{0};
8 (*always_ready*) method Bit#(1) io_input_en_{0};
9 (*always_ready*) method Bit#(1) io_pullup_en_{0};
10 (*always_ready*) method Bit#(1) io_pulldown_en_{0};
11 (*always_ready*) method Bit#(1) io_drivestrength_{0};
12 (*always_ready*) method Bit#(1) io_pushpull_en_{0};
13 (*always_ready*) method Bit#(1) io_opendrain_en_{0};
14 (*always_ready,always_enabled,result="io"*)
15 method Action io_inputval_{0}(Bit#(1) in);
16 '''
17 # == Peripheral Interface definitions == #
18 # these are the interface of the peripherals to the pin mux
19 # Outputs from the peripherals will be inputs to the pinmux
20 # module. Hence the change in direction for most pins
21
22 uartinterface_decl = '''
23 (*always_ready,always_enabled*) method Action tx_{0}(Bit#(1) in);
24 (*always_ready,always_enabled*) method Bit#(1) rx_{0};
25 '''
26
27 spiinterface_decl = '''
28 (*always_ready,always_enabled*) method Action sclk_{0} (Bit#(1) in);
29 (*always_ready,always_enabled*) method Action mosi_{0} (Bit#(1) in);
30 (*always_ready,always_enabled*) method Action ss_{0} (Bit#(1) in);
31 (*always_ready,always_enabled*) method Bit#(1) miso_{0};
32 '''
33
34 twiinterface_decl = '''
35 (*always_ready,always_enabled*) method Action sda{0}_out (Bit#(1) in);
36 (*always_ready,always_enabled*) method Action sda{0}_outen (Bit#(1) in);
37 (*always_ready,always_enabled*) method Bit#(1) sda{0}_in;
38 (*always_ready,always_enabled*) method Action scl{0}_out (Bit#(1) in);
39 (*always_ready,always_enabled*) method Action scl{0}_outen (Bit#(1) in);
40 (*always_ready,always_enabled*) method Bit#(1) scl{0}_in;
41 '''
42
43 sdinterface_decl = '''
44 (*always_ready,always_enabled*) method Action sd{0}_clk (Bit#(1) in);
45 (*always_ready,always_enabled*) method Action sd{0}_cmd (Bit#(1) in);
46 (*always_ready,always_enabled*) method Action sd{0}_d0_out (Bit#(1) in);
47 (*always_ready,always_enabled*) method Action sd{0}_d0_outen (Bit#(1) in);
48 (*always_ready,always_enabled*) method Bit#(1) sd{0}_d0_in;
49 (*always_ready,always_enabled*) method Action sd{0}_d1_out (Bit#(1) in);
50 (*always_ready,always_enabled*) method Action sd{0}_d1_outen (Bit#(1) in);
51 (*always_ready,always_enabled*) method Bit#(1) sd{0}_d1_in;
52 (*always_ready,always_enabled*) method Action sd{0}_d2_out (Bit#(1) in);
53 (*always_ready,always_enabled*) method Action sd{0}_d2_outen (Bit#(1) in);
54 (*always_ready,always_enabled*) method Bit#(1) sd{0}_d2_in;
55 (*always_ready,always_enabled*) method Action sd{0}_d3_out (Bit#(1) in);
56 (*always_ready,always_enabled*) method Action sd{0}_d3_outen (Bit#(1) in);
57 (*always_ready,always_enabled*) method Bit#(1) sd{0}_d3_in;
58 '''
59
60 jtaginterface_decl = '''
61 (*always_ready,always_enabled*) method Bit#(1) jtag{0}_tdi;
62 (*always_ready,always_enabled*) method Bit#(1) jtag{0}_tms;
63 (*always_ready,always_enabled*) method Bit#(1) jtag{0}_tclk;
64 (*always_ready,always_enabled*) method Bit#(1) jtag{0}_trst;
65 (*always_ready,always_enabled*) method Action jtag{0}_tdo(Bit#(1) in);
66 '''
67
68 pwminterface_decl = '''
69 (*always_ready,always_enabled*) method Action pwm{0}(Bit#(1) in);
70 '''
71 # ======================================= #
72
73 class Pin(object):
74
75 def __init__(self, name,
76 ready=True,
77 enabled=True,
78 io=False,
79 action=False,
80 inout=True):
81 self.name = name
82 self.ready = ready
83 self.enabled = enabled
84 self.io = io
85 self.action = action
86 self.inout = inout
87
88 def __str__(self):
89 res = ' (*'
90 status = []
91 if self.ready:
92 status.append('always_ready')
93 if self.enabled:
94 status.append('always_enabled')
95 if self.io:
96 status.append('result="io"')
97 res += ','.join(status)
98 res += "*) method "
99 if self.action:
100 res += " Action "
101 res += self.name
102 if self.inout:
103 res += ' (Bit#(1) in)'
104 res += ";"
105 return res
106
107 # basic test
108 if __name__ == '__main__':
109
110 def _pinmunge(p, sep, repl, dedupe=True):
111 """ munges the text so it's easier to compare.
112 splits by separator, strips out blanks, re-joins.
113 """
114 p = p.strip()
115 p = p.split(sep)
116 if dedupe:
117 p = filter(lambda x: x, p) # filter out blanks
118 return repl.join(p)
119
120 def pinmunge(p):
121 """ munges the text so it's easier to compare.
122 """
123 p = _pinmunge(p, "(", " ( ", False)
124 p = _pinmunge(p, ")", " ) ", False)
125 p = _pinmunge(p, " ", " ")
126 return p
127
128 pwm = Pin("pwm{0}", True, True, True, True)
129 print pinmunge(str(pwm))
130 print pinmunge(pwminterface_decl)
131 assert pinmunge(str(pwm)) == pinmunge(pwminterface_decl)