blob: ab2f1bad58eb209632e3f21687c321ed4849643e [file] [log] [blame]
# 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