# The backing store supporting the memories in the system has changed
# in that it is now stored globally per address range. As a result the
# actual storage is separate from the memory controllers themselves.
def upgrader(cpt):
    for sec in cpt.sections():
        import re

        # Search for a physical memory
        if re.search(".*sys.*\.physmem$", sec):
            # Add the number of stores attribute to the global physmem
            cpt.set(sec, "nbr_of_stores", "1")

            # Get the filename and size as this is moving to the
            # specific backing store
            mem_filename = cpt.get(sec, "filename")
            mem_size = cpt.get(sec, "_size")
            cpt.remove_option(sec, "filename")
            cpt.remove_option(sec, "_size")

            # Get the name so that we can create the new section
            system_name = str(sec).split(".")[0]
            section_name = system_name + ".physmem.store0"
            cpt.add_section(section_name)
            cpt.set(section_name, "store_id", "0")
            cpt.set(section_name, "range_size", mem_size)
            cpt.set(section_name, "filename", mem_filename)
        elif re.search(".*sys.*\.\w*mem$", sec):
            # Due to the lack of information about a start address,
            # this migration only works if there is a single memory in
            # the system, thus starting at 0
            raise ValueError("more than one memory detected (" + sec + ")")


legacy_version = 2
