| # Copyright lowRISC contributors. |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| # SPDX-License-Identifier: Apache-2.0 |
| """ |
| Dashboard project JSON file validation |
| """ |
| |
| import logging as log |
| from reggen.ip_block import REQUIRED_FIELDS, OPTIONAL_FIELDS |
| |
| |
| def check_keys(obj, required_keys, optional_keys, err_prefix): |
| error = 0 |
| for x in required_keys: |
| if x not in obj: |
| error += 1 |
| log.error(err_prefix + " missing required key " + x) |
| for x in obj: |
| if x not in required_keys and x not in optional_keys: |
| log.warning(err_prefix + " contains extra key rmn " + x) |
| # log.warning('{} contains extra key {!r}'.format(err_prefix, x)) |
| |
| return error |
| |
| |
| field_required = { |
| 'name': ['s', "module name"], |
| 'version': ['s', "module version"], |
| 'life_stage': ['s', "life stage of module"] |
| } |
| field_optional = { |
| 'design_spec': |
| ['s', "path to the design specification, relative to repo root"], |
| 'dv_doc': ['s', "path to the DV document, relative to repo root"], |
| 'hw_checklist': ['s', "path to the hw_checklist, relative to repo root"], |
| 'sw_checklist': ['s', "path to the sw_checklist, relative to repo root"], |
| 'design_stage': ['s', "design stage of module"], |
| 'dif_stage': ['s', 'DIF stage of module'], |
| 'verification_stage': ['s', "verification stage of module"], |
| 'notes': ['s', "random notes"], |
| } |
| |
| entry_required = { |
| 'version': ['s', "module version"], |
| 'life_stage': ['s', "life stage of module"] |
| } |
| entry_optional = { |
| 'design_stage': ['s', "design stage of module"], |
| 'verification_stage': ['s', "verification stage of module"], |
| 'dif_stage': ['s', 'DIF stage of module'], |
| 'commit_id': ['s', "Staged commit ID"], |
| 'notes': ['s', "notes"], |
| } |
| |
| |
| def validate(regs, is_comportable_spec): |
| if 'name' not in regs: |
| log.error("Component has no name. Aborting.") |
| return 1 |
| component = regs['name'] |
| |
| # If this is a comportable IP definition file, we |
| # need to use different requirements for validation. |
| if is_comportable_spec: |
| _field_required = REQUIRED_FIELDS |
| _field_optional = OPTIONAL_FIELDS |
| else: |
| _field_required = field_required |
| _field_optional = field_optional |
| |
| # If `revisions` is not in the object keys, the tool runs previous |
| # version checker, which has only one version entry. |
| if "revisions" not in regs: |
| error = check_keys(regs, _field_required, _field_optional, component) |
| if (error > 0): |
| log.error("Component has top level errors. Aborting.") |
| return error |
| |
| # Assumes `revisions` field exists in the Hjson object. |
| # It iterates the entries in the `revisions` group. |
| error = 0 |
| if not isinstance(regs['revisions'], list): |
| error += 1 |
| log.error("`revisions` field should be a list of version entries") |
| return error |
| |
| for rev in regs['revisions']: |
| error += check_keys(rev, entry_required, entry_optional, component) |
| |
| if (error > 0): |
| log.error("Component has errors in revision field. Aborting.") |
| |
| return error |