| # |
| # Copyright OpenEmbedded Contributors |
| # |
| # SPDX-License-Identifier: GPL-2.0-only |
| # |
| |
| # riscv_isa_to_tune(isa) |
| # |
| # Automatically translate a RISC-V ISA string to TUNE_FEATURES |
| # |
| # Abbreviations, such as rv32g -> rv32imaffd_zicsr_zifencei are supported. |
| # |
| # Profiles, such as rva22u64, are NOT supported, you must use ISA strings. |
| # |
| def riscv_isa_to_tune(isa): |
| _isa = isa.lower() |
| |
| feature = [] |
| iter = 0 |
| |
| # rv or riscv |
| if _isa[iter:].startswith('rv'): |
| feature.append('rv') |
| iter = iter + 2 |
| elif _isa[iter:].startswith('riscv'): |
| feature.append('rv') |
| iter = iter + 5 |
| else: |
| # Not a risc-v ISA! |
| return _isa |
| |
| while (_isa[iter:]): |
| # Skip _ and whitespace |
| if _isa[iter] == '_' or _isa[iter].isspace(): |
| iter = iter + 1 |
| continue |
| |
| # Length, just capture numbers here |
| if _isa[iter].isdigit(): |
| iter_end = iter |
| while iter_end < len(_isa) and _isa[iter_end].isdigit(): |
| iter_end = iter_end + 1 |
| |
| feature.append(_isa[iter:iter_end]) |
| iter = iter_end |
| continue |
| |
| # Typically i, e or g is next, followed by extensions. |
| # Extensions are single character, except for Z, Ss, Sh, Sm, Sv, and X |
| |
| # If the extension starts with 'Z', 'S' or 'X' use the name until the next _, whitespace or end |
| if _isa[iter] in ['z', 's', 'x']: |
| ext_type = _isa[iter] |
| iter_end = iter + 1 |
| |
| # Multicharacter extension, these are supposed to have a _ before the next multicharacter extension |
| # See 37.4 and 37.5: |
| # 37.4: Underscores "_" may be used to separate ISA extensions... |
| # 37.5: All multi-letter extensions ... must be separated from other multi-letter extensions by an underscore... |
| # Some extensions permit only alphabetic characters, while others allow alphanumeric chartacters |
| while iter_end < len(_isa) and _isa[iter_end] != "_" and not _isa[iter_end].isspace(): |
| iter_end = iter_end + 1 |
| |
| feature.append(_isa[iter:iter_end]) |
| iter = iter_end |
| continue |
| |
| # 'g' is special, it's an abbreviation for imafd_zicsr_zifencei |
| # When expanding the abbreviation, any additional letters must appear before the _z* extensions |
| if _isa[iter] == 'g': |
| _isa = 'imafd' + _isa[iter+1:] + '_zicsr_zifencei' |
| iter = 0 |
| continue |
| |
| feature.append(_isa[iter]) |
| iter = iter + 1 |
| continue |
| |
| # Eliminate duplicates, but preserve the order |
| feature = list(dict.fromkeys(feature)) |
| return ' '.join(feature) |