X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fbsv%2Finterface_decl.py;h=83ba313e350522cf4bba37df2227cfe2755fc905;hb=92cd44bcd9a90ea2f1eb0f49c9a498fde092f331;hp=e535db1509a8c30322592cdb77d3ce515ebd3b0a;hpb=526c16d0f57f404bb08485e337d2fd98b881f6ed;p=pinmux.git diff --git a/src/bsv/interface_decl.py b/src/bsv/interface_decl.py index e535db1..83ba313 100644 --- a/src/bsv/interface_decl.py +++ b/src/bsv/interface_decl.py @@ -20,7 +20,7 @@ class Pin(object): """ def __init__(self, name, - name_ = None, + name_=None, idx=None, ready=True, enabled=True, @@ -121,7 +121,7 @@ class Pin(object): def ifacedef2(self, fmtoutfn, fmtinfn, fmtdecfn): if self.action: fmtname = fmtinfn(self.name) - res = " interface %s = interface Put\n" % self.name_ + res = " interface %s = interface Put\n" % self.name_ res += ' method ' res += "Action put" #res += fmtdecfn(self.name) @@ -131,7 +131,7 @@ class Pin(object): res += ' endinterface;' else: fmtname = fmtoutfn(self.name) - res = " interface %s = interface Get\n" % self.name_ + res = " interface %s = interface Get\n" % self.name_ res += ' method ActionValue#' res += '(%s) get;\n' % self.bitspec res += " return %s;\n" % (fmtname) @@ -139,21 +139,110 @@ class Pin(object): res += ' endinterface;' return res - def ifacedef3(self, fmtoutfn, fmtinfn, fmtdecfn): + def ifacedef3(self, idx, fmtoutfn, fmtinfn, fmtdecfn): if self.action: fmtname = fmtinfn(self.name) if self.name.endswith('outen'): name = "tputen" else: name = "tput" - res = " %s <= in[%d];" % (fmtname, self.idx) + res = " %s <= in[%d];" % (fmtname, idx) else: fmtname = fmtoutfn(self.name) - res = " tget[%d] = %s;" % (self.idx, fmtname) + res = " tget[%d] = %s;" % (idx, fmtname) name = 'tget' return (name, res) -class Interface(PeripheralIface): + +class InterfaceFmt(object): + + def ifacepfmtdecpin(self, pin): + return pin.ifacepfmt(self.ifacepfmtdecfn) + + def ifacepfmtdecfn(self, name): + return name + + def ifacefmtoutfn(self, name): + return "wr%s" % name # like wruart + + def ifacefmtdecfn2(self, name): + return name # like: uart + + def ifacefmtdecfn3(self, name): + """ HACK! """ + return "%s_outen" % name # like uart_outen + + def ifacefmtinfn(self, name): + return "wr%s" % name + + def ifacedef2pin(self, pin): + decfn = self.ifacefmtdecfn2 + outfn = self.ifacefmtoutfn + # print pin, pin.outenmode + if pin.outenmode: + decfn = self.ifacefmtdecfn3 + outfn = self.ifacefmtoutenfn + return pin.ifacedef2(outfn, self.ifacefmtinfn, + decfn) + + def vectorifacedef2(self, pins, count, names, bitfmt, *args): + tput = [] + tget = [] + tputen = [] + if len(pins) == 0: + return '' + # XXX HACK! assume in, out and inout, create set of indices + # that are repeated three times. + plens = [] + # ARG even worse hack for LCD *sigh*... + if names[1] is None and names[2] is None: + plens = range(len(pins)) + else: + for i in range(0, len(pins), 3): + plens += [i / 3, i / 3, i / 3] + for (typ, txt) in map(self.ifacedef3pin, plens, pins): + if typ == 'tput': + tput.append(txt) + elif typ == 'tget': + tget.append(txt) + elif typ == 'tputen': + tputen.append(txt) + tput = '\n'.join(tput).format(*args) + tget = '\n'.join(tget).format(*args) + tputen = '\n'.join(tputen).format(*args) + bitfmt = bitfmt.format(count) + template = ["""\ + interface {3} = interface Put#({0}) + method Action put({2} in); +{1} + endmethod + endinterface; +""", + """\ + interface {3} = interface Put#({0}) + method Action put({2} in); +{1} + endmethod + endinterface; +""", + """\ + interface {3} = interface Get#({0}) + method ActionValue#({2}) get; + {2} tget; +{1} + return tget; + endmethod + endinterface; +"""] + res = '' + tlist = [tput, tputen, tget] + for i, n in enumerate(names): + if n: + res += template[i].format(count, tlist[i], bitfmt, n) + return '\n' + res + '\n' + + +class Interface(PeripheralIface, InterfaceFmt): """ create an interface from a list of pinspecs. each pinspec is a dictionary, see Pin class arguments single indicates that there is only one of these, and @@ -169,6 +258,7 @@ class Interface(PeripheralIface): def __init__(self, ifacename, pinspecs, ganged=None, single=False): PeripheralIface.__init__(self, ifacename) + InterfaceFmt.__init__(self) self.ifacename = ifacename self.ganged = ganged or {} self.pins = [] # a list of instances of class Pin @@ -195,7 +285,7 @@ class Interface(PeripheralIface): # NOTice - outen key is removed else: name = p['name'] - if name.isdigit(): # HACK! deals with EINT case + if name.isdigit(): # HACK! deals with EINT case name = self.pname(name) _p['name_'] = name _p['idx'] = idx @@ -287,32 +377,13 @@ class Interface(PeripheralIface): res = '\n'.join(map(self.ifacefmtdecpin, self.pins)).format(*args) return '\n' + res # pins is a list - def ifacepfmtdecfn(self, name): - return name - def ifacefmtdecfn(self, name): return name # like: uart - def ifacefmtdecfn2(self, name): - return name # like: uart - - def ifacefmtdecfn3(self, name): - """ HACK! """ - return "%s_outen" % name # like uart_outen - - def ifacefmtoutfn(self, name): - return "wr%s" % name # like wruart - - def ifacefmtinfn(self, name): - return "wr%s" % name - def wirefmtpin(self, pin): return pin.wirefmt(self.ifacefmtoutfn, self.ifacefmtinfn, self.ifacefmtdecfn2) - def ifacepfmtdecpin(self, pin): - return pin.ifacepfmt(self.ifacepfmtdecfn) - def ifacefmtdecpin(self, pin): return pin.ifacefmt(self.ifacefmtdecfn) @@ -326,16 +397,6 @@ class Interface(PeripheralIface): return pin.ifacedef(outfn, self.ifacefmtinfn, decfn) - def ifacedef2pin(self, pin): - decfn = self.ifacefmtdecfn2 - outfn = self.ifacefmtoutfn - # print pin, pin.outenmode - if pin.outenmode: - decfn = self.ifacefmtdecfn3 - outfn = self.ifacefmtoutenfn - return pin.ifacedef2(outfn, self.ifacefmtinfn, - decfn) - def ifacedef(self, *args): res = '\n'.join(map(self.ifacefmtpin, self.pins)) res = res.format(*args) @@ -368,60 +429,189 @@ class IOInterface(Interface): def wirefmt(self, *args): return generic_io.format(*args) -class InterfaceGPIO(Interface): + +class InterfaceBus(InterfaceFmt): + + def __init__(self, pins, is_inout, namelist, bitspec, filterbus): + InterfaceFmt.__init__(self) + self.namelist = namelist + self.bitspec = bitspec + self.fbus = filterbus # filter identifying which are bus pins + self.pins_ = pins + self.is_inout = is_inout + self.buspins = filter(lambda x: x.name_.startswith(self.fbus), + self.pins_) + self.nonbuspins = filter(lambda x: not x.name_.startswith(self.fbus), + self.pins_) + + def get_nonbuspins(self): + return self.nonbuspins + + def get_buspins(self): + return self.buspins + + def get_n_iopinsdiv(self): + return 3 if self.is_inout else 1 def ifacepfmt(self, *args): - return """ - interface Put#(Vector#({0}, Bit#(1))) out; - interface Put#(Vector#({0}, Bit#(1))) out_en; - interface Get#(Vector#({0}, Bit#(1))) in; -""".format(len(self.pinspecs)) + pins = self.get_nonbuspins() + res = '\n'.join(map(self.ifacepfmtdecpin, pins)).format(*args) + res = res.format(*args) + + pins = self.get_buspins() + plen = len(pins) / self.get_n_iopinsdiv() + + res += '\n' + template = " interface {1}#(%s) {2};\n" % self.bitspec + for i, n in enumerate(self.namelist): + if not n: + continue + ftype = 'Get' if i == 2 else "Put" + res += template.format(plen, ftype, n) + + return "\n" + res def ifacedef2(self, *args): - tput = [] - tget = [] - tputen = [] - for (typ, txt) in map(self.ifacedef2pin, self.pins): - if typ == 'tput': - tput.append(txt) - elif typ == 'tget': - tget.append(txt) - elif typ == 'tputen': - tputen.append(txt) - tput = '\n'.join(tput).format(*args) - tget = '\n'.join(tget).format(*args) - tputen = '\n'.join(tputen).format(*args) + pins = self.get_nonbuspins() + res = '\n'.join(map(self.ifacedef2pin, pins)) + res = res.format(*args) - template = """\ - interface out = interface Put#({0}) - method Action put(Vector#({0},Bit#(1)) in); -{1} - endmethod - endinterface; - interface out_en = interface Put#({0}) - method Action put(Vector#({0},Bit#(1)) in); -{2} - endmethod - endinterface; - interface in = interface Get#({0}) - method ActionValue#(Vector#({0},Bit#(1))) get; - Vector#({0},Bit#(1)) tget; -{3} - return tget; - endmethod - endinterface; -""".format(len(self.pinspecs), tput, tputen, tget) - return '\n' + template + '\n' + pins = self.get_buspins() + plen = len(pins) / self.get_n_iopinsdiv() + for pin in pins: + print "ifbus pins", pin.name_, plen + bitspec = self.bitspec.format(plen) + print self + return '\n' + res + self.vectorifacedef2( + pins, plen, self.namelist, bitspec, *args) - def ifacedef2pin(self, pin): + def ifacedef3pin(self, idx, pin): decfn = self.ifacefmtdecfn2 outfn = self.ifacefmtoutfn # print pin, pin.outenmode if pin.outenmode: decfn = self.ifacefmtdecfn3 outfn = self.ifacefmtoutenfn - return pin.ifacedef3(outfn, self.ifacefmtinfn, - decfn) + return pin.ifacedef3(idx, outfn, self.ifacefmtinfn, + decfn) + + +class InterfaceMultiBus(object): + + def __init__(self, pins): + self.multibus_specs = [] + self.nonbuspins = pins + self.nonb = self.add_bus(False, [], '', "xxxxxxxnofilter") + + def add_bus(self, is_inout, namelist, bitspec, filterbus): + pins = self.nonbuspins + buspins = filter(lambda x: x.name_.startswith(filterbus), pins) + nbuspins = filter(lambda x: not x.name_.startswith(filterbus), pins) + self.nonbuspins = nbuspins + b = InterfaceBus(buspins, is_inout, + namelist, bitspec, filterbus) + print is_inout, namelist, filterbus, buspins + self.multibus_specs.append(b) + self.multibus_specs[0].pins_ = nbuspins + self.multibus_specs[0].nonbuspins = nbuspins + + def ifacepfmt(self, *args): + res = '' + #res = Interface.ifacepfmt(self, *args) + for b in self.multibus_specs: + res += b.ifacepfmt(*args) + return res + + def ifacedef2(self, *args): + res = '' + #res = Interface.ifacedef2(self, *args) + for b in self.multibus_specs: + res += b.ifacedef2(*args) + return res + + +class InterfaceLCD(InterfaceBus, Interface): + + def __init__(self, *args): + Interface.__init__(self, *args) + InterfaceBus.__init__(self, self.pins, False, ['data_out', None, None], + "Bit#({0})", "out") + + +class InterfaceSDRAM(InterfaceMultiBus, Interface): + + def __init__(self, ifacename, pinspecs, ganged=None, single=False): + Interface.__init__(self, ifacename, pinspecs, ganged, single) + InterfaceMultiBus.__init__(self, self.pins) + self.add_bus(False, ['dqm', None, None], + "Bit#({0})", "sdrdqm") + self.add_bus(True, ['d_out', 'd_out_en', 'd_in'], + "Bit#({0})", "sdrd") + self.add_bus(False, ['ad', None, None], + "Bit#({0})", "sdrad") + self.add_bus(False, ['ba', None, None], + "Bit#({0})", "sdrba") + + def ifacedef2(self, *args): + return InterfaceMultiBus.ifacedef2(self, *args) + + +class InterfaceFlexBus(InterfaceMultiBus, Interface): + + def __init__(self, ifacename, pinspecs, ganged=None, single=False): + Interface.__init__(self, ifacename, pinspecs, ganged, single) + InterfaceMultiBus.__init__(self, self.pins) + self.add_bus(True, ['ad_out', 'ad_out_en', 'ad_in'], + "Bit#({0})", "ad") + self.add_bus(False, ['bwe', None, None], + "Bit#({0})", "bwe") + self.add_bus(False, ['tsiz', None, None], + "Bit#({0})", "tsiz") + self.add_bus(False, ['cs', None, None], + "Bit#({0})", "cs") + + def ifacedef2(self, *args): + return InterfaceMultiBus.ifacedef2(self, *args) + + +class InterfaceSD(InterfaceBus, Interface): + + def __init__(self, *args): + Interface.__init__(self, *args) + InterfaceBus.__init__(self, self.pins, True, ['out', 'out_en', 'in'], + "Bit#({0})", "d") + + +class InterfaceNSPI(InterfaceBus, Interface): + + def __init__(self, *args): + Interface.__init__(self, *args) + InterfaceBus.__init__(self, self.pins, True, + ['io_out', 'io_out_en', 'io_in'], + "Bit#({0})", "io") + + +class InterfaceEINT(Interface): + """ uses old-style (non-get/put) for now + """ + + def ifacepfmt(self, *args): + res = '\n'.join(map(self.ifacefmtdecpin, self.pins)).format(*args) + return '\n' + res # pins is a list + + def ifacedef2(self, *args): + return self.ifacedef(*args) + + +class InterfaceGPIO(InterfaceBus, Interface): + """ note: the busfilter cuts out everything as the entire set of pins + is a bus, but it's less code. get_nonbuspins returns empty list. + """ + + def __init__(self, ifacename, pinspecs, ganged=None, single=False): + Interface.__init__(self, ifacename, pinspecs, ganged, single) + InterfaceBus.__init__(self, self.pins, True, ['out', 'out_en', 'in'], + "Vector#({0},Bit#(1))", ifacename[-1]) class Interfaces(InterfacesBase, PeripheralInterfaces): @@ -430,7 +620,16 @@ class Interfaces(InterfacesBase, PeripheralInterfaces): def __init__(self, pth=None): InterfacesBase.__init__(self, Interface, pth, - {'gpio': InterfaceGPIO }) + {'gpio': InterfaceGPIO, + 'spi': InterfaceNSPI, + 'mspi': InterfaceNSPI, + 'lcd': InterfaceLCD, + 'sd': InterfaceSD, + 'fb': InterfaceFlexBus, + 'sdr': InterfaceSDRAM, + 'qspi': InterfaceNSPI, + 'mqspi': InterfaceNSPI, + 'eint': InterfaceEINT}) PeripheralInterfaces.__init__(self) def ifacedef(self, f, *args):