def __init__(self, type=MemoryType.OTHER, start=0, end=0, length=None, **attrs):
        """! Memory region constructor.
        
        Memory regions are required to have non-zero lengths, unlike memory ranges.
        
        Some common optional region attributes passed as keyword arguments:
        - name: If a name is not provided, the name is set to the region type in lowercase.
        - access: composition of r, w, x, s
        - alias
        - is_boot_memory
        - is_powered_on_boot
        - is_testable
        """
        super(MemoryRegion, self).__init__(start=start, end=end, length=length)
        assert self.length > 0, "Memory regions must have a non-zero length."
        assert isinstance(type, MemoryType)
        self._map = None
        self._type = type
        self._attributes = attrs
        
        # Assign default values to any attributes missing from kw args.
        for k, v in self.DEFAULT_ATTRS.items():
            if k not in self._attributes:
                self._attributes[k] = v
def __init__ ( self , type = MemoryType . OTHER , start = 0 , end = 0 , length = None , ** attrs ) : super ( MemoryRegion , self ) . __init__ ( start = start , end = end , length = length ) assert self . length > 0 , "Memory regions must have a non-zero length." assert isinstance ( type , MemoryType ) self . _map = None self . _type = type self . _attributes = attrs for k , v in self . DEFAULT_ATTRS . items ( ) : if k not in self . _attributes : self . _attributes [ k ] = v
! Memory region constructor.
        
        Memory regions are required to have non-zero lengths, unlike memory ranges.
        
        Some common optional region attributes passed as keyword arguments:
        - name: If a name is not provided, the name is set to the region type in lowercase.
        - access: composition of r, w, x, s
        - alias
        - is_boot_memory
        - is_powered_on_boot
        - is_testable