| # 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 |