def parse (name):
        """parse(name) -> [typename | None, nelems | None]

        Parses an ArrayType name to return the element type name and
        number of elements, e.g.:

            >>> ArrayType.parse('MSB_U16[32]')
            ['MSB_U16', 32]

        If typename cannot be determined, None is returned.
        Similarly, if nelems is not an integer or less than one (1),
        None is returned.
        """
        parts = [None, None]
        start = name.find('[')

        if start != -1:
            stop = name.find(']', start)
            if stop != -1:
                try:
                    parts[0] = name[:start]
                    parts[1] = int(name[start + 1:stop])
                    if parts[1] <= 0:
                        raise ValueError
                except ValueError:
                    msg  = 'ArrayType specification: "%s" must have an '
                    msg += 'integer greater than zero in square brackets.'
                    raise ValueError(msg % name)

        return parts
parse(name) -> [typename | None, nelems | None]

        Parses an ArrayType name to return the element type name and
        number of elements, e.g.:

            >>> ArrayType.parse('MSB_U16[32]')
            ['MSB_U16', 32]

        If typename cannot be determined, None is returned.
        Similarly, if nelems is not an integer or less than one (1),
        None is returned.