use class iterator for mk_connection (all of them)
[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 print "gpioslow", self.peripheral.configs
40 size = len(self.peripheral.pinspecs)
41 dflt_ = "%s" % ("0" * size * 2) # default if not set in spec
42 dflt = self.peripheral.configs[0].get("muxconfig", dflt_)
43 return "MUX#(%d) mux{0} <- mkmux('b%s);\n" % (size, dflt) + \
44 "GPIO#(%d) gpio{0} <- mkgpio();" % size
45
46 def mk_connection(self, name, count, fabricname, typ):
47 print "GPIO mk_conn", self.name, count
48 res = []
49 dname = self.mksuffix(self.name, count)
50 for i, n in enumerate(['gpio' + dname, 'mux' + dname]):
51 res.append(PBase.mk_connection(self, name, count, fabricname, typ,
52 name_override=n))
53 return '\n'.join(res)
54
55 def _mk_connection(self, name=None, count=0):
56 n = self.mksuffix(name, count)
57 if name.startswith('gpio'):
58 return "gpio{0}.axi_slave".format(n)
59 if name.startswith('mux'):
60 return "mux{0}.axi_slave".format(n)
61
62 def mksuffix(self, name, i):
63 if name.startswith('mux'):
64 return name[3:]
65 return name[4:]
66
67 def mk_cellconn(self, name, count, cellnum):
68 ret = []
69 bank = self.mksuffix(name, count)
70 txt = "pinmux.mux_lines.cell{0}_mux(mux{1}.mux_config.mux[{2}]);"
71 for p in self.peripheral.pinspecs:
72 ret.append(txt.format(cellnum, bank, p['name'][1:]))
73 cellnum += 1
74 return ("\n".join(ret), cellnum)
75
76 def pinname_out(self, pname):
77 return "func.gpio_out[{0}]".format(pname[1:])
78
79 def pinname_outen(self, pname):
80 return "func.gpio_out_en[{0}]".format(pname[1:])
81
82 def _mk_pincon(self, name, count, typ):
83 #ret = [PBase.mk_pincon(self, name, count)]
84 # special-case for gpio in, store in a temporary vector
85 assert typ == 'slow'
86 ret = []
87 plen = len(self.peripheral.pinspecs)
88 template = "mkConnection({0}.{1},\n\t\t\t{2}_{1});"
89 ps = "pinmux.peripheral_side.%s" % name
90 n = "{0}.func.gpio".format(name)
91 for ptype in ['out', 'out_en', 'in']:
92 ret.append(template.format(ps, ptype, n))
93 return '\n'.join(ret)