add external interfaces v2
[pinmux.git] / src / bsv / peripheral_gen / gpio.py
1 from bsv.peripheral_gen.base import PBase
2
3
4 class gpio(PBase):
5
6 def slowimport(self):
7 return " import pinmux::*;\n" + \
8 " import mux::*;\n" + \
9 " import gpio::*;\n"
10
11 def extifinstance2(self, name, count):
12 template = "interface pad_config{0} = {1}.pad_config;"
13 dname = self.mksuffix(self.name, count)
14 return template.format(dname, name)
15
16 def slowifdeclmux(self, name, count):
17 size = len(self.peripheral.pinspecs)
18 dname = self.mksuffix(self.name, count)
19 return "interface GPIO_config#(%d) pad_config%s;" % \
20 (size, dname)
21
22 def num_axi_regs32(self):
23 return 2
24
25 def axi_slave_idx(self, idx, name, ifacenum, typ):
26 """ generates AXI slave number definition, except
27 GPIO also has a muxer per bank
28 """
29 name = name.upper()
30 mname = 'mux' + name[4:]
31 mname = mname.upper()
32 print "AXIslavenum", name, mname
33 (ret, x) = PBase.axi_slave_idx(self, idx, name, ifacenum, typ)
34 (ret2, x) = PBase.axi_slave_idx(self, idx + 1, mname, ifacenum, typ)
35 return ("%s\n%s" % (ret, ret2), 2)
36
37 def mkslow_peripheral(self, size=0):
38 print "gpioslow", self.peripheral, dir(self.peripheral)
39 size = len(self.peripheral.pinspecs)
40 return " MUX#(%d) mux{0} <- mkmux();\n" % size + \
41 " GPIO#(%d) gpio{0} <- mkgpio();" % size
42
43 def mk_connection(self, count, fabricname, typ):
44 print "GPIO mk_conn", self.name, count
45 res = []
46 dname = self.mksuffix(self.name, count)
47 for i, n in enumerate(['gpio' + dname, 'mux' + dname]):
48 res.append(PBase.mk_connection(self, count, fabricname, typ, n))
49 return '\n'.join(res)
50
51 def _mk_connection(self, name=None, count=0):
52 n = self.mksuffix(name, count)
53 if name.startswith('gpio'):
54 return "gpio{0}.axi_slave".format(n)
55 if name.startswith('mux'):
56 return "mux{0}.axi_slave".format(n)
57
58 def mksuffix(self, name, i):
59 if name.startswith('mux'):
60 return name[3:]
61 return name[4:]
62
63 def mk_cellconn(self, cellnum, name, count):
64 ret = []
65 bank = self.mksuffix(name, count)
66 txt = " pinmux.mux_lines.cell{0}_mux(mux{1}.mux_config.mux[{2}]);"
67 for p in self.peripheral.pinspecs:
68 ret.append(txt.format(cellnum, bank, p['name'][1:]))
69 cellnum += 1
70 return ("\n".join(ret), cellnum)
71
72 def pinname_out(self, pname):
73 return "func.gpio_out[{0}]".format(pname[1:])
74
75 def pinname_outen(self, pname):
76 return "func.gpio_out_en[{0}]".format(pname[1:])
77
78 def mk_pincon(self, name, count):
79 #ret = [PBase.mk_pincon(self, name, count)]
80 # special-case for gpio in, store in a temporary vector
81 ret = []
82 plen = len(self.peripheral.pinspecs)
83 template = " mkConnection({0}.{1},\n\t\t\t{2}_{1});"
84 ps = "pinmux.peripheral_side.%s" % name
85 n = "{0}.func.gpio".format(name)
86 for ptype in ['out', 'out_en', 'in']:
87 ret.append(template.format(ps, ptype, n))
88 return '\n'.join(ret)