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