def METHOD_NAME(addr):
    vf_bars_list = list()
    bar_base = addr + ctypes.sizeof(SRIOVBase)
    bar_addr = bar_base
    bar_end = bar_base + 0x18
    while bar_addr < bar_end:
        bar = ctypes.c_uint32.from_address(bar_addr).value
        idx = int((bar_addr - bar_base) / 4)
        if (bar & PCIE_BAR_SPACE_MASK) == PCIE_BAR_MEMORY_SPACE:
            if (bar & PCIE_BAR_TYPE_MASK) == PCIE_BAR_TYPE_64_BIT:
                vf_bars_list.append((f"vf_bar{idx}", MemoryBar64))
                bar_addr += 0x8
            else:
                vf_bars_list.append((f"vf_bar{idx}", MemoryBar32))
                bar_addr += 0x4
        else:
            vf_bars_list.append((f"vf_bar{idx}", IOBar))
            bar_addr += 0x4
    class SRIOV(cdata.Struct, ExtendedCapability):
        class VFBars(cdata.Struct):
            _pack_ = 1
            _fields_ = vf_bars_list
            def __iter__(self):
                for f in self._fields_:
                    yield getattr(self, f[0])
        _pack_ = 1
        _fields_ = copy.copy(SRIOVBase._fields_) + [
            ('vf_bars', VFBars),
            ('vf_migration_state_array_offset', ctypes.c_uint32),
        ]
    return SRIOV