+""" define functions here, with their pin names and the pin type.
+
+ each function returns a pair of lists
+ (or objects with a __getitem__ function)
+
+ the first list (or object) contains pin name plus type specifications.
+
+ the type is:
+
+ * "-" for an input pin,
+ * "+" for an output pin,
+ * "*" for an in/out pin
+
+ each function is then added to the pinspec tuple, below, as a ("NAME",
+ function) entry.
+
+ different functions may be added multiple times under the same NAME,
+ so that complex (or large) functions can be split into one or more
+ groups (and placed on different pinbanks).
+
+ eint, pwm and gpio are slightly odd in that instead of a fixed list
+ an object is returned with a __getitem__ function that accepts a
+ slice object. in this way the actual generation of the pin name
+ is delayed until it is known precisely how many pins are to be
+ generated, and that's not known immediately (or it would be if
+ every single one of the functions below had a start and end parameter
+ added). see spec.interfaces.PinGen class slice on pingroup
+
+ the second list is the names of pins that are part of an inout bus.
+ this list of pins (a ganged group) will need to be changed under
+ the control of the function, as a group. for example: sdmmc's
+ D0-D3 pins are in-out, they all change from input to output at
+ the same time under the control of the function, therefore there's
+ no point having multiple in-out switch/control wires, as the
+ sdmmc is never going to do anything other than switch this entire
+ bank all at once. so in this particular example, sdmmc returns:
+
+ (['CMD+', 'CLK+', 'D0*', 'D1*', 'D2*', 'D3*'] # pin names
+ ['D0*', 'D1*', 'D2*', 'D3*']) # ganged bus names
+"""
+
+