def find_by_path(self, path):
        pathparts = path.split('.')
        current_node = self
        for pathpart in pathparts:
            m = re.fullmatch(r'^(\w+)((?:\[(?:\d+|0[xX][\da-fA-F]+)\])*)$', pathpart)
            if not m:
                raise ValueError("Invalid path")
            inst_name, array_suffix = m.group(1,2)
            idx_list = [ int(s,0) for s in re.findall(r'\[(\d+|0[xX][\da-fA-F]+)\]', array_suffix) ]
            current_node = current_node.get_child_by_name(inst_name)
            if current_node is None:
                return None
            if idx_list:
                if (isinstance(current_node, AddressableNode)) and current_node.inst.is_array:
                    if len(idx_list) != len(current_node.inst.array_dimensions):
                        raise IndexError("Wrong number of array dimensions")
                    current_node.current_idx = []
                    for i,idx in enumerate(idx_list):
                        if idx >= current_node.inst.array_dimensions[i]:
                            raise IndexError("Array index out of range")
                        current_node.current_idx.append(idx)
                else:
                    raise IndexError("Index attempted on non-array component")
        return current_node