| import re |
|
|
| def match_nvidia_architecture(conditions_dict, architecture): |
| """ |
| Match Nvidia architecture against condition dictionary. |
| |
| Args: |
| conditions_dict: dict with condition strings as keys, parameters as values |
| architecture: int representing architecture (e.g., 89 for Ada Lovelace) |
| |
| Returns: |
| list of matched parameters |
| |
| Condition syntax: |
| - Operators: '<', '>', '<=', '>=', '=' (or no operator for equality) |
| - OR: '+' between conditions (e.g., '<=50+>89') |
| - AND: '&' between conditions (e.g., '>=70&<90') |
| - Examples: |
| * '<89': architectures below Ada (89) |
| * '>=75': architectures 75 and above |
| * '89': exactly Ada architecture |
| * '<=50+>89': Maxwell (50) and below OR above Ada |
| * '>=70&<90': Ampere range (70-89) |
| """ |
| |
| def eval_condition(cond, arch): |
| """Evaluate single condition against architecture""" |
| cond = cond.strip() |
| if not cond: |
| return False |
| |
| |
| match = re.match(r'(>=|<=|>|<|=?)(\d+)', cond) |
| if not match: |
| return False |
| |
| op, val = match.groups() |
| val = int(val) |
| |
| |
| if op in ('', '='): |
| return arch == val |
| elif op == '>=': |
| return arch >= val |
| elif op == '<=': |
| return arch <= val |
| elif op == '>': |
| return arch > val |
| elif op == '<': |
| return arch < val |
| return False |
| |
| def matches_condition(condition_str, arch): |
| """Check if architecture matches full condition string""" |
| |
| return any( |
| all(eval_condition(and_cond, arch) for and_cond in or_cond.split('&')) |
| for or_cond in condition_str.split('+') |
| if or_cond.strip() |
| ) |
| |
| |
| return [params for condition, params in conditions_dict.items() |
| if matches_condition(condition, architecture)] |